Создание скрипта для "пустого" пароля в /etc/shadow
Я написал скрипт для добавления пользователей CVS и SVN на сервер Linux (Slackware 14.0). Этот сценарий создает пользователя при необходимости и либо копирует ключ SSH пользователя из существующей учетной записи оболочки, либо генерирует новый ключ SSH.
Просто чтобы быть ясно, счета специально для SVN или CVS. Таким образом, запись в /home/${username}/.ssh/authorized_keys
начинается с (на примере CVS):
command="/usr/bin/cvs server",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ....etc...etc...etc...
Настоящий доступ к оболочке никогда не будет разрешен для этих пользователей - они предназначены исключительно для предоставления доступа к нашим исходным репозиториям через SSH.
Моя проблема в том, что когда я добавляю нового пользователя, он получает пустой пароль в /etc/shadow
по умолчанию. Это выглядит как:
paddycvs:!:15679:0:99999:7:::
Если я оставлю файл теней как есть (с !
), Аутентификация SSH не проходит. Чтобы включить SSH, я должен сначала запустить passwd
для нового пользователя и введите что-то.
У меня есть две проблемы с этим. Во-первых, он требует ввода пользователя, который я не могу разрешить в этом скрипте. Во-вторых, он потенциально позволяет пользователю войти в систему на физическом терминале (если у него есть физический доступ, который он мог бы знать, и знает секретный пароль - хорошо, так что это маловероятно).
Я обычно запрещаю пользователям вход в систему, чтобы установить их оболочку /bin/false
, но если я сделаю это, то SSH тоже не сработает!
У кого-нибудь есть предложения по написанию этого сценария? Должен ли я просто использовать sed
или что-то и заменить соответствующую строку в теневом файле на предварительно заданную зашифрованную строку секретного пароля? Или есть лучший способ?
Ура =)
5 ответов
Чтобы избежать проблем с блокировкой или испорчением теневого файла, вы можете использовать
echo username:some_string | chpasswd
Более конкретно: вы могли бы на самом деле использовать *
в поле пароля, выполнив это:
echo "username:*" | chpasswd -e
Ты пытался
passwd -d username
удаляет ввод пароля конкретного пользователя из /etc/shadow file
, По сути, создание конкретного пользователя войти в систему как пустой пароль.
Он может быть применен только как пользователь root или sudo.
И еще одно решение, которое не включает конвейер, заключается в следующем (также можно найти в пакете shadow, или shadow-utils):
usermod -p '*' username
Ну, я немного поиграл и обнаружил, что если я превращу пароль в *
в /etc/shadow
, он разрешает SSH, но запрещает вход в систему паролей на TTY. Поэтому я добавлю это как ответ на свой вопрос.
Это было добавлено в мой скрипт после useradd
вызов:
cp /etc/shadow /etc/shadow.backup
sed -e "s/^\(${username}:\)[^:]*:/\1*:/" /etc/shadow.backup > /etc/shadow
Он заменяет запись пароля определенного пользователя на *
,
Более новые версии OpenSSH проверяют /etc/shadow, чтобы увидеть, отключена ли учетная запись. У отключенной учетной записи есть знак "!", Поэтому ее изменение на * решит проблему.