場合によっては、パスワードなしのサーバーが好きだということを認めざるを得ません。一般的なサーバーは、物理的にアクセスできるすべてのユーザーに対して脆弱です。したがって、場合によっては、物理的にロックしてから、信頼するany物理アクセスが実用的です。
理論的には、このようなサーバーに物理的にアクセスすると、ログインとしてroot
と入力するだけで、パスワードなしで管理タスクを実行できるはずであり、パスワードの入力を求められることはありません。同じことがユーザーアカウントにも当てはまるかもしれませんが、実際にはそれらに物理的にアクセスすることはできません。したがって、(時折)ローカルアクセスにシステムパスワードは必要ありません。
管理またはユーザーアカウントのいずれかでサーバーにリモートアクセスするときは、常にSSH秘密キーを使用することを期待しています。作成したばかりのアカウントにSSHキーを設定するのは非常に簡単であるため、(通常の)リモートアクセスにシステムパスワードは必要ありません。
# user=...
#
# useradd -m "$user"
# Sudo -i -u "$user"
$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"
結論として、理論的には、そのようなユースケースではanyシステムパスワードは必要ありません。したがって、問題は、一貫性のある安全な方法でそれを実現するために、システムアカウントとユーザーアカウントをどのように構成するかということです。
パスワードなしでrootアカウントにローカルでアクセスできるようにするにはどうすればよいですか? passwd -d
を使用してrootアクセスを許可しすぎて、権限のないユーザーが無料でrootにswitchできるようになるとは思いませんが、これは誤りです。ログインできないため、passwd -l
は使用できません。
ローカルアクセスとは、ローカルキーボードを使用したアクセスに限定されることに注意してください。したがって、有効なソリューション不可は、ユーザーの切り替えを許可します(su
またはSudo
を使用するかどうかにかかわらず)。
最近まで上記の解決策は機能していましたが、SSHはロックされたユーザーアカウントのチェックを開始しました。同じ理由で、passwd -d
はおそらく使用できません。 passwd -u
は、passwd -d
の機能につながると文句を言うだけなので使用できません。
この部分にはダミーのパスワードを使用する回避策があります。
user=...
echo -ne "$user:`pwgen 16`\n" | chpasswd
SSHでロックされたアカウントのチェックを完全にオフにすることも可能かもしれませんが、ロックされたアカウントのサポートを維持し、それらのロックを解除できる方がよいでしょう。
私が興味を持っているのは、パスワードなしで、ローカルでrootアカウントに、リモートでrootを含むすべてのアカウントにログインできるソリューションです。一方、ソリューションは、特にリモートユーザーがルートアカウントや他のユーザーのアカウントにアクセスできるようにすることを除いて、明示的に説明されている方法を除いて、セキュリティに影響を与えてはなりません。ソリューションは、セキュリティの問題を間接的に引き起こさないように、十分に堅牢である必要があります。
承認されて授与された回答は、個々のツールの詳細な構成を説明している場合と説明していない場合がありますが、指定された目標を達成するための重要なポイントが含まれている必要があります。これは、passwd
、ssh
、su
、Sudo
などの従来のツールの使用ではおそらく解決できないことに注意してください。
単なるアイデア–ローカルルートアクセスは、ログインプロセスの代わりにルートシェルを起動することで実現できます。ただし、公開鍵認証ではなく、パスワード認証のみをロックする必要があります。
箇条書きとして、ソリューションを提供する要件:
次の例はDebianに基づいています。これは、私がここでテスト用に入手したものだからです。しかし、原則がどのディストリビューション(または実際にPAMベースの* ix派生物)にも適用できない理由はわかりません。
パスワードなしのルートコンソールログイン
私がこれに取り組む方法は、PAMと/etc/securetty
構成ファイルを活用することだと思います。
前提条件として、「十分に安全な」ルートパスワードを設定する必要があります。これはコンソールログインには必要ありませんが、ブルートフォースクラッキングの試みを非現実的にするために存在します。それ以外の場合、アカウントは完全に通常のルートアカウントです。
/etc/pam.d/login
には、認証用に次の標準行セットがあります(キーワードauth
で始まるもの)。
auth optional pam_faildelay.so delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth requisite pam_nologin.so
@include common-auth
auth optional pam_group.so
参照されるcommon-auth
インクルードファイルには、以下の関連する行が含まれています。
auth [success=1 default=ignore] pam_unix.so nullok_secure
auth requisite pam_deny.so
auth required pam_permit.so
auth optional pam_cap.so
common-auth
ファイルは、「UNIXログイン」が成功した場合に1つのルール(拒否)をスキップするようにPAMに指示します。通常、これは/etc/shadow
での一致を意味します。
auth ... pam_securetty.so
行は、/etc/securetty
で指定されたttyデバイスを除いて、rootログインを防止するように構成されています。 (このファイルには、すでにすべてのコンソールデバイスが含まれています。)
このauth
行を少し変更することで、/etc/securetty
で指定されたttyデバイスからのルートログインパスワードなしを許可するルールを定義できます。 success=ok
パラメーターを修正して、一致が成功した場合にスキップされるok
行の数にauth
が置き換えられるようにする必要があります。ここに示されている状況では、その番号は3
であり、これはauth ... pam_permit.so
行にジャンプします。
auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
事前承認されたユーザーからのパスワードなしのrootリモートログイン
これは、ルートauthorized_keys
ファイルに追加される許可されたユーザーのsshキーを簡単に含めることです。
事前承認されたユーザーからの指定されたアカウントのパスワードなしのリモートログイン
これは、適切で対応するユーザーの.ssh/authorized_keys
ファイルに追加される許可ユーザーのsshキーを簡単に含めることでもあります。 (典型的なリモートユーザーchrisは、ローカルユーザーchrisシナリオへのパスワードなしのログインを望んでいます。)
アカウントは作成後もデフォルトのロック状態のままにすることができますが(つまり、!
のパスワードフィールドに/etc/shadow
を入力するだけで)、SSHキーベースのログインを許可することに注意してください。これには、新しいユーザーの.ssh/authorized_keys
ファイルにキーを配置するためのrootが必要です。 それほど明白ではありません とは、このアプローチはUsePAM Yes
が/etc/ssh/sshd_config
に設定されている場合にのみ使用できるということです。 PAMは、!
を「パスワードのためにアカウントがロックされていますが、他のアクセス方法が許可されている可能性があります」と!...
「アカウントがロックされています。期間」と区別します。 (UsePAM No
が設定されている場合、OpenSSHは、パスワードフィールドを開始する!
の存在を考慮して、ロックされたアカウントを表します。)
事前承認されたユーザーからのアカウントのパスワードなしリモートログイン
この施設が必要かどうかは私には完全にはわかりませんでした。つまり、特定の許可されたユーザーは、すべてのローカルアカウントにパスワードなしでsshログインできます。
このシナリオをテストすることはできませんが、OpenSSH 5.9以降で実現できると思います。これにより、複数のauthorized_keys
ファイルを/etc/ssh/sshd_config
で定義できます。構成ファイルを編集して、/etc/ssh/authorized_keys
という2番目のファイルを含めます。選択した許可ユーザーの公開鍵をこのファイルに追加し、アクセス許可がrootによって所有され、root(0644)によってのみ書き込みアクセス権を持つようにします。
SshキーとNOPASSWD
を介した完全なSudo
アクセスを備えた実際の(root以外の)ユーザーアカウントが必要なようです(これは最近のほとんどのLinuxディストリビューションでデフォルトで利用可能であり、インストールも簡単です。手動で)。ユーザーアカウントごとに空白のパスワードを設定でき(リモートでは機能しません)、ユーザーはSudo -s
を実行するか、ユーザーの~/.bash_profile
にそのコマンドが含まれているだけです。
sudo
各ユーザーをSudo
UNIXグループに追加します(例:usermod -a -G Sudo USERNAME
。ただし、古いシステムではこれを行う方法が直感的ではありません。最悪の場合、/etc/groups
を直接編集します)。
/etc/sudoers
または/etc/sudoers.d/local
には、次のような行が必要です。
%Sudo ALL=(ALL:ALL) NOPASSWD: ALL
自動ルートアクセスが必要な場合は、これをユーザーのプロファイルに追加します。 bash
の場合、それは~/.bash_profile
になります。
Sudo -s
これにより、誰がログインしているかを確認し(who
またはlast
を試してください)、ログを/var/log/auth.log
に残します。
パスワードなしのログイン
はるかに古いシステムでは、/etc/passwd
(または少し古いシステムでは/etc/shadow
)を編集してハッシュを削除するだけで済みます。たとえば、 bob:$1$salt$hash:12345:0:99999:7:::
はbob::12345:0:99999:7:::
になります。必要なのはこれだけでした。現代のシステムはこれを好まない。これを行うには他の方法も考えられますが、私が確認した方法は次のとおりです。 (出典: レオのランダムなもの ):
/etc/shadow
を開き、実際の情報を持つアカウントを観察します。これには、ドル記号($
)で区切られた3つの要素が含まれます。これらはハッシュメカニズムを表し、次に salt 、次にハッシュを表します。塩に注意して、これを実行します。
openssl passwd -1 -salt SALT
(これはハッシュメカニズムとしてMD5を使用します。これは空のパスワードなので、気にする必要はありません。)パスワードの入力を求められたら、Enterキーを押します。末尾のドットを含めてその文字列を保存し、/etc/shadow
のそのユーザーの行の最初のコロンの後に貼り付けます(これにより、最初のコロンと2番目のコロンの間にある既存のコンテンツが置き換えられます)。 (SALT
を文字として使用しないでください!)
[〜#〜] ssh [〜#〜]
ssh
デーモン構成は、/etc/sshd_config
または/etc/ssh/sshd_config
のどちらかにあります。適切なセキュリティのために、次の行を含めることをお勧めします。
PermitRootLogin no
PermitEmptyPasswords no
高度な攻撃者に対してより適切に強化するためにssh構成に追加できる追加のセキュリティ対策については、 Secure Secure Shell の記述を参照してください。
これで、ユーザーはcannotパスワードが空であるため、ssh
経由でログインします(これは必要なセキュリティ対策です)。つまり、sshキーでのみログインできます。
各クライアントシステムの各ユーザーは、sshキーペアを作成する必要があります。
ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"
これにより、$HOME/.ssh/id_rsa
に秘密鍵が生成され、$HOME/.ssh/id_rsa.pub
に公開鍵が生成されます。そのユーザーに公開鍵を送信して、このサーバーの$HOME/.ssh/authorized_keys
に追加してもらいます(各ユーザーの$HOME/.ssh
はモード700である必要があります。例:mkdir -p ~user/.ssh && chmod 700 ~user/.ssh
)。
Sshキーを必要としないユーザーは、物理システムに移動できます。そこで、彼らの空のパスワードは彼らをログインさせ、その時点で彼らはシェルからpasswd
を入力してパスワードを設定することができ、それにより彼らにリモートアクセスを許可します。
(IT部門を運営していたときに、実際にこの手法を使用してシステムのコレクションにアクセスできるようにしました。ユーザーにsshキーの使用を強制し、パスワードを与える必要がありませんでした。最初の~/.bash_profile
には2つありました一番下の行:passwd
、次にmv ~/.bash_profile.real ~/.bash_profile
で、最初のログイン時に新しいパスワードを設定します。
リスク
ユーザーを完全に信頼しています。ユーザーが別のユーザーの~/.ssh/authorized_keys
ファイルをいじって、アクセスを取り消したり監査したりする機能を変更することを妨げるものは何もありませんが、完全なルートアクセスを許可する場合、これは避けられません。
結論
これで、各ユーザーはSudoグループのメンバーになり、ルートシェルへの完全なパスワードなしのアクセス権を持ちます。これらのユーザーにはアカウントのパスワードがなく、sshキーを使用してリモートでログインできます。
従業員の1人を失った場合、その従業員のアカウントを削除できます。従業員のラップトップの1つが盗まれた場合、そのラップトップのsshキーをそのユーザーのauthorized_keys
ファイルから削除できます。セキュリティ違反がある場合は、誰がログインしたかを示すログがあります。