Как создавать пользователей на лету
Это просто плохая идея, которую я только что получил.
Есть ли способ создания учетных записей пользователей на лету?
Скажем, у меня есть Ubuntu vm, и я хочу дать доступ нескольким людям. Но по какой-то причине меня не особо волнует, что они с этим делают.
Как настроить, чтобы при входе пользователя A ssh в виртуальную машину учетная запись пользователя создавалась автоматически?
и да, я знаю, в теории, я мог бы просто создать гостевую учетную запись и поделиться ею с людьми, которым нужен доступ. но тогда куча людей будет делиться учетной записью, и я также хочу записать, что все сделали, поэтому иметь их на одной учетной записи будет очень сложно.
и да, это очень плохая идея.
2 ответа
Мне нравится вызов. Да, вы можете сделать это, если вы хотите, чтобы первый ssh потерпел неудачу. Следующий скрипт (который я на самом деле тестировал) привязывает журнал sshd, который по умолчанию (в моей системе) выдает такие строки при неудачном входе в систему через ssh:
Jun 20 21:06:35 home sshd[18163]: Invalid user dummy from ::1
Когда такая строка совпадает, извлекается идентификатор пользователя (в этом примере - фиктивный), и создается учетная запись пользователя с зашифрованным паролем, который совпадает с идентификатором пользователя (фиктивным). Вторая попытка входа в систему теперь будет работать.
# encrypt a cleartext password given as arg
cryptpw(){
perl -e '
my $pw = "'"$1"'";
my $salt = join("",("a".."z")[rand 26,rand 26]);
printf "%s\n", crypt($pw,$salt);'
}
sudo journalctl --no-pager -lfu sshd |
while read line
do if [[ "$line" =~ "Invalid user "([^ ]*) ]]
then newuser=${BASH_REMATCH[1]}
pw=$(cryptpw "$newuser")
sudo useradd "$newuser" -p "$pw"
fi
done
Пользователь может затем скопировать свой ключ на пульт:
ssh-copy-id dummy@host
Если у них еще нет ключа, сначала выполните:
ssh-keygen -t rsa -f ~/.ssh/id_rsa -q -N ''
С помощью python
:
#!/usr/bin/env python2
import re, crypt, subprocess
with open('/var/log/auth.log') as logfile, open('/etc/passwd') as passfile:
given_usernames = []
for line in logfile:
name = re.search(r'(?<= Invalid user ).*?(?= from)', line)
if name:
given_usernames.append(name.group())
current_usernames = []
for line in passfile:
current_usernames.append(re.search(r'^[^:]+', line).group())
for i in given_usernames:
if i not in current_usernames:
password = crypt.crypt(i + str(123), 'foobar12')
subprocess.call('sudo useradd -m -p {0} {1}'.format(password, i).split())
Когда пользователь пытается войти в компьютер через
ssh
кто не имеет существующей учетной записи, будет отказано в доступе, и этот инцидент будет записан в/var/log/auth.log
файл, содержащий строку, например:Jun 21 01:11:03 my_hostname sshd[17763]: Invalid user foobar from 192.168.4.2
мы будем использовать эту строку для извлечения предоставленного имени пользователя, чтобы создать учетную запись для этого пользователя, чтобы в следующий раз пользователь мог войти без проблем
Мы использовали пароль в качестве имени пользователя плюс
123
(сольfoobar12
) т.е. если имя пользователяspamegg
пароль будетspamegg123
, Вы можете изменить его и соль на любое значение, которое вы хотите, и, конечно, пользователь должен изменить пароль после первого входа в систему.В этом подходе все имена пользователей из
/var/log/auth.log
файл взят в список и аналогично все имена пользователей из/etc/passwd
также взяты в список.Затем мы проверили, существует ли уже введенное имя пользователя, если нет, то пользователь создается с паролем, упомянутым ранее.
Вы можете запустить его как
cron
работа, чтобы убедиться, что имена пользователей добавляются автоматически.