Как создавать пользователей на лету

Это просто плохая идея, которую я только что получил.

Есть ли способ создания учетных записей пользователей на лету?

Скажем, у меня есть 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 работа, чтобы убедиться, что имена пользователей добавляются автоматически.

Другие вопросы по тегам