User creation scripts for aws servers
This commit is contained in:
189
Readme.md
Normal file
189
Readme.md
Normal file
@@ -0,0 +1,189 @@
|
||||
# AWS User Creation
|
||||
|
||||
Two files to create new user entries with an SSH key and zip all the data for download
|
||||
|
||||
## Setup
|
||||
|
||||
The application **pwgen** and **zip** must be installed.
|
||||
|
||||
Copy the two files '*user_create.sh*', '*user_zip.sh*' to any target folder on the target aws server.
|
||||
For exmaple `/root/bin`
|
||||
|
||||
`$> mkdir /root/bin`
|
||||
|
||||
Create a base folder where all the user lists and keys are stored.
|
||||
For example `/root/users`
|
||||
|
||||
`$> mkdir /root/users`
|
||||
|
||||
The script will automatically create `/ssh-keygen` as as sub folder to above set `/root/users`
|
||||
|
||||
## User list creation
|
||||
|
||||
In the `/root/users` folder there needs to be a file called '*user_list.txt*'
|
||||
|
||||
This is a CSV type file with the following layout
|
||||
|
||||
ID | Username | Group | Optional Password
|
||||
-|-|-|-
|
||||
|
||||
The ID, Username and Group column must be filled.
|
||||
If the password column is filled, the string from here will be used as the PEM Key password.
|
||||
|
||||
The ID can be any string in any form.
|
||||
It can also be left empty. It is not used at the moment
|
||||
|
||||
The file can hold comments. The first character in the line must be a *#*
|
||||
|
||||
Example file
|
||||
```
|
||||
user1;some.name;group-a
|
||||
user2;othername;group-a
|
||||
# I am a comment
|
||||
;username;groupC;setpassword
|
||||
...
|
||||
```
|
||||
|
||||
### User with existing PEM key
|
||||
|
||||
If we want to create a user that already has a PEM key or we want to have the user use the same PEM key for login we can copy the existing pub key into the ssh key folder
|
||||
|
||||
If the folder `ssh-keygen` does not exist, create it as as sub folder to the folder where the '*user_list.txt*' is located
|
||||
|
||||
In our example
|
||||
|
||||
`$> mkdir /root/users/ssh-keygen`
|
||||
|
||||
The public PEM key file format is as followed
|
||||
|
||||
**group name**-**user name**.pem.pub
|
||||
|
||||
In the example above for *user1* the file name would be for **some.name** and **group-a**
|
||||
|
||||
`group-a-some.name.pem.pub`
|
||||
|
||||
Copy this file into the ssh-keygen folder and add the user to the '*user_list.txt*' file.
|
||||
This must be with the same name and group as set in the PEM public key.
|
||||
|
||||
Example:
|
||||
|
||||
PEM public key file is `Bgroup-foobar.pem.pub`
|
||||
Then the line for the '*user_list.txt*' must be
|
||||
|
||||
`[some user id];foobar;Bgroup`
|
||||
|
||||
Note that *[some user id]* can be any string or left empty
|
||||
|
||||
## Script run
|
||||
|
||||
The current directory **MUST** be the directory where '*user_list.txt*' is stored.
|
||||
|
||||
`$> cd /root/users`
|
||||
|
||||
Then run the script without any options
|
||||
|
||||
`$> /root/bin/user_create.sh`
|
||||
|
||||
Sample output for above example file
|
||||
```
|
||||
++ Create 'some.name:group-a'
|
||||
> Create ssh key-pair '/root/users/ssh-keygen/group-a-some.name.pem'
|
||||
Generating public/private rsa key pair.
|
||||
Your identification has been saved in /root/users/ssh-keygen/group-a-some.name.pem.
|
||||
Your public key has been saved in /root/users/ssh-keygen/group-a-some.name.pem.pub.
|
||||
The key fingerprint is:
|
||||
SHA256:Ufalh41IRLJTHZlsaEJVK5N7cOYhxRdqf3fCDxhHdCA egrp10070.globalad.org: some.name@group-a
|
||||
The key's randomart image is:
|
||||
+---[RSA 3072]----+
|
||||
| .o+O*E=*o.|
|
||||
| .Bo=B@.. |
|
||||
| +oB.&.+ |
|
||||
| o @ O |
|
||||
| S . + = +|
|
||||
| . =o|
|
||||
| .|
|
||||
| |
|
||||
| |
|
||||
+----[SHA256]-----+
|
||||
> Create .ssh folder
|
||||
> Add public into authorized_keys
|
||||
> Secure folder .ssh and authorized_keys file
|
||||
```
|
||||
|
||||
If the public pem file is already provided the output will be a bit different
|
||||
```
|
||||
++ Create 'some.name:group-a'
|
||||
< Use existing public ssh key '/root/users/ssh-keygen/group-a-some.name.pem.pub'
|
||||
> Create .ssh folder
|
||||
> Add public into authorized_keys
|
||||
> Secure folder .ssh and authorized_keys file
|
||||
```
|
||||
|
||||
There is no SSH key generate output but *Use existing public ssh key* information line
|
||||
|
||||
If the user has been created, the creating will be skipped
|
||||
```
|
||||
-- Skip 'some.name:group-a'
|
||||
```
|
||||
|
||||
## Script output
|
||||
|
||||
The generated users and the passwords are stored in the '*user_password.txt*' file
|
||||
|
||||
For above the output will be
|
||||
```
|
||||
2020-11-27 13:51:01;sever.hostname.org;some.name;Aeh9uph8Oo
|
||||
2020-11-27 13:51:02;sever.hostname.org;othername;AePejoo9ch
|
||||
2020-11-27 13:51:02;sever.hostname.org;username;setpassword
|
||||
```
|
||||
|
||||
Note that the *sever.hostname.org* is set from the hostname of the server where the script is unr
|
||||
|
||||
If a existing pem public key is used, the entry for a new user will be
|
||||
```
|
||||
2020-11-27 13:53:18;sever.hostname.org;some.name;[ALREADY SET]
|
||||
```
|
||||
|
||||
Not that the password field has now *[ALREADY SET]*
|
||||
|
||||
### PEM key password reset
|
||||
|
||||
The SSH PEM key password can be reset or changed with
|
||||
|
||||
`$> ssh-keygen -p -f [PEM].pem -P old_passphrase -N new_passphrase`
|
||||
|
||||
To remove the password use this `-N ""`
|
||||
|
||||
**NOTE**
|
||||
|
||||
If the command is used like this it will be stored in the history file.
|
||||
For scurity reason it is recommended to not give the -P and -N options when changing the password.
|
||||
|
||||
### Missing PUB key
|
||||
|
||||
The public key part can be extracted from the SSH PEM key with
|
||||
|
||||
`$> ssh-keygen -y -f [PEM].pem > [PEM].pem.pub`
|
||||
|
||||
*[PEM]* is the placeholder for the filename
|
||||
|
||||
## Get the user data
|
||||
|
||||
To copy the user data with the SSH PEM file and password list the following command can be used.
|
||||
Like the create user command it **MUST** be run in the folder where the '*user_list.txt*'
|
||||
|
||||
`$> cd /root/users`
|
||||
|
||||
The script needs to be run with one parameter that is the folder where the output file '*users.zip*' is stored.
|
||||
|
||||
`$> /root/bin/user_zip.sh [target folder]`
|
||||
|
||||
In the *[target folder]* a file name '*users.zip*' will be created.
|
||||
This file has the following data data inside
|
||||
- user_list.txt
|
||||
- user_password.txt
|
||||
- ssh-keygen/*.pem
|
||||
- ssh-keygen/*.pem.pub
|
||||
|
||||
When extracted this will **NOT** create a sub folder.
|
||||
Create a folder where to store this data on the local side is highly recommended
|
||||
130
user_create.sh
Executable file
130
user_create.sh
Executable file
@@ -0,0 +1,130 @@
|
||||
#!/bin/bash
|
||||
|
||||
# * input file
|
||||
# user_list.txt
|
||||
# <ignored id>;<user name>;<group>[;optional override password]
|
||||
# lines with # are skipped
|
||||
# already created users are skipped
|
||||
# * output file
|
||||
# <date>;<target connect host name>;<username>;<password>
|
||||
# If already existing PEM key is used then <password> is [ALREADY SET]
|
||||
#
|
||||
# * PEM KEY
|
||||
# <group>-<user>.pem
|
||||
# * PUBLIC KEY
|
||||
# <group>-<user>.pem.pub
|
||||
# store in
|
||||
# ssh-keygen/
|
||||
#
|
||||
# If a previously exsting PEM key should be used, put the public pem file
|
||||
# into the ssh-keygen/ folder
|
||||
# They pem pub key must follow the set rules above
|
||||
|
||||
# SET TO 1 to TEST [will no create user/group/folder]
|
||||
TEST=0;
|
||||
# hostname for output file only
|
||||
host=$(hostname);
|
||||
# base folder for all data
|
||||
root_folder=$(pwd)'/';
|
||||
input_file='user_list.txt';
|
||||
output_file='user_password.txt';
|
||||
ssh_keygen_folder='ssh-keygen/';
|
||||
# check if ssh key folder exists
|
||||
if [ ! -d "${root_folder}${ssh_keygen_folder}" ]; then
|
||||
mkdir "${root_folder}${ssh_keygen_folder}";
|
||||
fi;
|
||||
# check if password generate software is installed
|
||||
if [ ! command -v pwgen &> /dev/null ]; then
|
||||
echo "Missing pwgen application, aborting";
|
||||
exit;
|
||||
fi;
|
||||
# check if user list file exists
|
||||
if [ ! -f "${root_folder}${input_file}" ]; then
|
||||
echo "Missing ${root_folder}${input_file}";
|
||||
exit;
|
||||
fi;
|
||||
# create users
|
||||
cat "${root_folder}${input_file}" |
|
||||
while read i; do
|
||||
# skip rows start with # (comment)
|
||||
if [[ "${i}" =~ ^# ]]; then
|
||||
echo -e "";
|
||||
else
|
||||
user=$(echo "${i}" | cut -d ";" -f 2 | tr A-Z a-z);
|
||||
group=$(echo "${i}" | cut -d ";" -f 3 | tr A-Z a-z);
|
||||
# user & group not set
|
||||
if [ -z "${user}" ] || [ -z "${group}" ]; then
|
||||
echo "[!!!!!] Missing user or group entry for ${user}/${group}";
|
||||
echo "[ABORT RUN]"
|
||||
break;
|
||||
fi;
|
||||
# do we have a password preset
|
||||
_password=$(echo "${i}" | cut -d ";" -f 4);
|
||||
# add group
|
||||
if [ ${TEST} -eq 0 ]; then
|
||||
groupadd -f ${group};
|
||||
else
|
||||
echo "$> groupadd -f ${group}";
|
||||
fi;
|
||||
# SSH key base name (removed ${host}- so we can use it more easy for multi server same key)
|
||||
ssh_keygen_id="${group}-${user}.pem";
|
||||
# check if user is not already created
|
||||
if getent passwd ${user} > /dev/null 2>&1; then
|
||||
echo "-- Skip '${user}:${group}'";
|
||||
else
|
||||
echo "++ Create '${user}:${group}'";
|
||||
if [ ${TEST} -eq 0 ]; then
|
||||
useradd -s /bin/bash -g ${group} -m ${user};
|
||||
else
|
||||
echo "$> useradd -s /bin/bash -g ${group} -m ${user}";
|
||||
fi;
|
||||
# if public pem already exists skip creation
|
||||
if [ ! -f ${root_folder}${ssh_keygen_folder}${ssh_keygen_id}".pub" ]; then
|
||||
# Note we only create a password if we need it
|
||||
# password + store pwgen 10 1 -1
|
||||
if [ -z "${_password}" ]; then
|
||||
password=$(printf "%s" $(pwgen 10 1));
|
||||
else
|
||||
echo "! Override password set";
|
||||
password=${_password};
|
||||
fi;
|
||||
# create SSH key
|
||||
echo " > Create ssh key-pair '${root_folder}${ssh_keygen_folder}${ssh_keygen_id}'";
|
||||
ssh-keygen -f ${root_folder}${ssh_keygen_folder}${ssh_keygen_id} -C "${host}: ${user}@${group}" -N "${password}"
|
||||
else
|
||||
echo " < Use existing public ssh key '${root_folder}${ssh_keygen_folder}${ssh_keygen_id}.pub'";
|
||||
# Password already set notification
|
||||
password="[ALREADY SET]";
|
||||
fi;
|
||||
# write login info to output file
|
||||
echo $(date +"%F %T")";"${host}";"${user}";"${password} >> ${root_folder}${output_file};
|
||||
# create the SSH foler and authorized access file with correct permissions
|
||||
echo " > Create .ssh folder";
|
||||
if [ ${TEST} -eq 0 ]; then
|
||||
mkdir /home/${user}/.ssh/;
|
||||
else
|
||||
echo "$> mkdir /home/${user}/.ssh/";
|
||||
fi;
|
||||
echo " > Add public into authorized_keys";
|
||||
if [ ${TEST} -eq 0 ]; then
|
||||
cat ${root_folder}${ssh_keygen_folder}/${ssh_keygen_id}.pub > /home/${user}/.ssh/authorized_keys;
|
||||
else
|
||||
echo "$> cat ${root_folder}${ssh_keygen_folder}/${ssh_keygen_id}.pub > /home/${user}/.ssh/authorized_keys";
|
||||
fi;
|
||||
echo " > Secure folder .ssh and authorized_keys file";
|
||||
if [ ${TEST} -eq 0 ]; then
|
||||
chown -R ${user}:${group} /home/${user}/.ssh/;
|
||||
chmod 700 /home/${user}/.ssh/;
|
||||
chmod 600 /home/${user}/.ssh/authorized_keys;
|
||||
else
|
||||
echo "$> chown -R ${user}:${group} /home/${user}/.ssh/";
|
||||
echo "$> chmod 700 /home/${user}/.ssh/";
|
||||
echo "$> chmod 600 /home/${user}/.ssh/authorized_keys";
|
||||
fi;
|
||||
fi;
|
||||
fi;
|
||||
done;
|
||||
|
||||
if [ -f "${root_folder}${output_file}" ]; then
|
||||
chmod 600 ${root_folder}${output_file};
|
||||
fi;
|
||||
19
user_zip.sh
Executable file
19
user_zip.sh
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
|
||||
root_folder=$(pwd)'/';
|
||||
|
||||
if [ ! command -v zip &> /dev/null ]; then
|
||||
echo "Missing zip application, aborting";
|
||||
exit;
|
||||
fi;
|
||||
|
||||
# arg 1 must be valid path to where we store the zip file
|
||||
if [ ! -d "${1}" ]; then
|
||||
echo "${1} is not a valid path";
|
||||
exit;
|
||||
fi;
|
||||
|
||||
# zip key folder, user list, user password into users.zip
|
||||
echo "Zipping data to: ${1}/users.zip"
|
||||
$(cd "${root_folder}"; zip -FSr "${1}/users.zip" "user_list.txt" "user_password.txt" "ssh-keygen/");
|
||||
echo "Data zipped";
|
||||
Reference in New Issue
Block a user