web-dev-qa-db-ja.com

SSHを使用したパスワードなしのアカウントへの一貫した安全なアプローチ

場合によっては、パスワードなしのサーバーが好きだということを認めざるを得ません。一般的なサーバーは、物理的にアクセスできるすべてのユーザーに対して脆弱です。したがって、場合によっては、物理的にロックしてから、信頼する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を含むすべてのアカウントにログインできるソリューションです。一方、ソリューションは、特にリモートユーザーがルートアカウントや他のユーザーのアカウントにアクセスできるようにすることを除いて、明示的に説明されている方法を除いて、セキュリティに影響を与えてはなりません。ソリューションは、セキュリティの問題を間接的に引き起こさないように、十分に堅牢である必要があります。

承認されて授与された回答は、個々のツールの詳細な構成を説明している場合と説明していない場合がありますが、指定された目標を達成するための重要なポイントが含まれている必要があります。これは、passwdsshsuSudoなどの従来のツールの使用ではおそらく解決できないことに注意してください。

最初の答えを読んだ後のより多くのアイデア

単なるアイデア–ローカルルートアクセスは、ログインプロセスの代わりにルートシェルを起動することで実現できます。ただし、公開鍵認証ではなく、パスワード認証のみをロックする必要があります。

13
Pavel Šimerda

箇条書きとして、ソリューションを提供する要件:

  1. パスワードなしのルートコンソールログイン
  2. 事前承認されたユーザーからのパスワードなしのルートリモートログイン
  3. 事前承認されたユーザーからの指定されたアカウントへのパスワードなしのリモートログイン
  4. 事前承認されたユーザーからの任意のアカウントのパスワードなしのリモートログイン

次の例は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)によってのみ書き込みアクセス権を持つようにします。

5
roaima

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ファイルから削除できます。セキュリティ違反がある場合は、誰がログインしたかを示すログがあります。

1
Adam Katz