web-dev-qa-db-ja.com

/ etc / shadowで「空の」パスワードをスクリプト化する

Linuxサーバー(Slackware 14.0)にCVSユーザーとSVNユーザーを追加するスクリプトを作成しました。このスクリプトは、必要に応じてユーザーを作成し、既存のシェルアカウントからユーザーの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を実行し、何かを入力する必要があります。

それを行うには2つの問題があります。まず、このスクリプトでは許可できないユーザー入力が必要です。次に、ユーザーが物理端末にログインできるようになる可能性があります(物理アクセス権があり、秘密のパスワードを知っている場合は、そうなる可能性があります)。

通常、ユーザーがログインできないようにする方法は、シェルを/bin/falseに設定することですが、そうするとSSHも機能しません。

誰かがこれをスクリプト化するための提案がありますか?単にsedなどを使用して、シャドウファイルの関連する行を事前設定された暗号化された秘密のパスワード文字列に置き換える必要がありますか?それとももっと良い方法はありますか?

乾杯=)

1
paddy

ロックやシャドウファイルの混乱を回避するために、おそらく次のように使用できます。

echo username:some_string | chpasswd

具体的には、次のようにすることで、パスワードフィールドで実際に*を使用できます。

echo "username:*" | chpasswd -e
1
tink

また、パイプを使用しないさらに別の解決策は次のとおりです(shadow、resp。shadow-utilsパッケージにもあります)。

usermod -p '*' username
3
dev-zero

やってみました

passwd -d username

特定のユーザーのパスワードエントリを/etc/shadow fileから削除します。基本的に、特定のユーザーを空のパスワードとしてログインさせます。

RootまたはSudoユーザーとしてのみ強制できます。

2
user2977819

さて、もう少し遊んでみたところ、パスワードを*/etc/shadowに変換すると、SSHは許可されますが、TTYでのパスワードログインは無効になります。だから私はこれを私自身の質問への答えとして追加します。

これは、useradd呼び出しの後にスクリプトに追加されました。

cp /etc/shadow /etc/shadow.backup
sed -e "s/^\(${username}:\)[^:]*:/\1*:/" /etc/shadow.backup > /etc/shadow

特定のユーザーのシャドウパスワードエントリを*に置き換えます。

1
paddy

新しいバージョンのOpenSSHは、/ etc/shadowをチェックして、アカウントが無効になっているかどうかを確認します。無効にされたアカウントには!があるため、これを*に変更すると問題が解決します。

0
MattPark