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
などを使用して、シャドウファイルの関連する行を事前設定された暗号化された秘密のパスワード文字列に置き換える必要がありますか?それとももっと良い方法はありますか?
乾杯=)
ロックやシャドウファイルの混乱を回避するために、おそらく次のように使用できます。
echo username:some_string | chpasswd
具体的には、次のようにすることで、パスワードフィールドで実際に*
を使用できます。
echo "username:*" | chpasswd -e
また、パイプを使用しないさらに別の解決策は次のとおりです(shadow、resp。shadow-utilsパッケージにもあります)。
usermod -p '*' username
やってみました
passwd -d username
特定のユーザーのパスワードエントリを/etc/shadow file
から削除します。基本的に、特定のユーザーを空のパスワードとしてログインさせます。
RootまたはSudoユーザーとしてのみ強制できます。
さて、もう少し遊んでみたところ、パスワードを*
で/etc/shadow
に変換すると、SSHは許可されますが、TTYでのパスワードログインは無効になります。だから私はこれを私自身の質問への答えとして追加します。
これは、useradd
呼び出しの後にスクリプトに追加されました。
cp /etc/shadow /etc/shadow.backup
sed -e "s/^\(${username}:\)[^:]*:/\1*:/" /etc/shadow.backup > /etc/shadow
特定のユーザーのシャドウパスワードエントリを*
に置き換えます。
新しいバージョンのOpenSSHは、/ etc/shadowをチェックして、アカウントが無効になっているかどうかを確認します。無効にされたアカウントには!があるため、これを*に変更すると問題が解決します。