Linux ssh:ユーザーに秘密キーの読み取り権限を付与せずに公開キー認証を許可する


14

Linuxサーバーにログインしているユーザーは、デフォルトアカウントで特定のリモートマシンにsshできる必要があります。リモートマシンでの認証は公開鍵を使用するため、サーバーでは対応する秘密鍵が利用可能です。

サーバーユーザーが実際に秘密キーを読み取れるようにしたくありません。基本的に、彼らがサーバーにアクセスできるという事実は、彼らにsshの権利を許可し、サーバーからそれらを削除することは、リモートマシンへの接続も許可しないはずです。

ユーザーが秘密キーへの読み取りアクセスを許可せずにssh接続を開くことを許可するにはどうすればよいですか?

これまでの私の考え:明らかにssh実行可能ファイルは秘密鍵を読み取れる必要があるため、それらの権利を持つサーバー上の別のユーザーの下で実行する必要があります。ssh接続が確立されたら、ユーザーに「転送」して、ユーザーがコマンドを入力してリモートマシンと対話できるようにします。

  • これは良いアプローチですか?
  • フォワードをどのように実装すればよいですか?
  • ユーザーはどのようにして接続を開始できますか(つまり、キーの読み取り権限を持つユーザーによるsshの実行)?
  • セキュリティの抜け穴はありますか?-ユーザーが別のユーザーとしてsshを実行できる場合、他のユーザーができること(秘密鍵の読み取りなど)をすべて実行できますか?


1
サーバーのIPからのみそのキーとの接続を受け入れるようにリモートサーバーを構成しますか?そうすれば、鍵を盗んだとしても何もできません。

@AndréDanielは、サーバーからのパスワードなしのログインも受け入れるように構成されている、まったく関係のない別のコンピューターにログインできる可能性があります。それが私がこのようなセットアップを持つことを考えることができる唯一の理由です。そうでない場合は、それが何であるかについてかなり興味があります。(それは重要ではない、本当に。)
デビッドZ 14年

@DavidZ私は本当に理解していません...キー、IPが最初のサーバー(ユーザーが接続する先のサーバー)の1つと一致すると仮定して、ターゲットサーバー上以外では信頼されるべきではありません

2
この方法でロックダウンする必要がある場合、ユーザーが~/.ssh/authorized_keysファイルに新しい公開キーを追加できないようにする手段を講じていると思いますか?
mpontillo 14年

回答:


31

それが理由の一つですsudo。ユーザーが事前に承認されたコマンドラインオプションのみで1つのコマンドを実行できるようにするだけで、最も明らかな回避策が解決されます。例えば

#/etc/sudoers
%users ALL = (some_uid) NOPASSWD: /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

sudoグループのすべてのメンバーが、users実行時に自分のパスワード(またはsome_uidアカウントのパスワード)を入力せずに、ユーザーsome_uidとしてsshコマンドを実行できるように設定します。

sudo -u some_uid /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

NOPASSWD:リモートホストにログインする前にユーザーが自分のパスワードを入力することを強制するオプションを削除します。正しい引数を使用するのは非常に難しい
ので、ユーザーの利便性としてエイリアスまたはラッパースクリプトをセットアップすることsudoもできます。


魅力のように機能します。これは、wenzulが言及した重複に対する推奨される回答でもあります。
フィリップ14年

10

これは、ホストベースの認証の良いユースケースのようです。これは、SSHが認証にローカルマシン(この場合はサーバー)上の個々のユーザーのキーを使用しない認証方法です。代わりに、ホストの秘密鍵を使用します。この秘密鍵は、に保存され/etc/ssh/、でのみ読み取り可能rootです。

これを設定するには.shosts、リモートマシン上で、ログインするユーザーのホームディレクトリに名前を付けたファイルを作成する必要があります(ではなく~/.ssh)。ファイルには内容が含まれている必要があります

server-hostname +

ここserver-hostnameで、サーバーの名前は、+「任意のユーザー」を意味するワイルドカードとして機能するリテラルのプラス記号です。

また、リモートマシンがサーバーのホストキーを検証できることを確認する必要があります。つまり、サーバーのホストキーをリモートマシン/etc/ssh/ssh_known_hostsまたは~/.ssh/known_hostsリモートマシンにリストする必要があります。そうでない場合は、リモートマシンにログインして実行することでセットアップできます。

ssh-keyscan server-hostname >> /etc/ssh/ssh_known/hosts

これらの手順を設定したら、サーバーで秘密鍵を完全に削除できます(他に必要ない場合)。(そして、あなたがそうするなら、あなたはいつでもそれだけで読めるようにそれを設定することができますroot。)

また、特定のユーザーのリモートマシンへのアクセスを許可または拒否するなどの簡単な操作を実行できます。詳細については、sshおよびのmanページhosts.equivを参照してください。

このセットアップの1つの問題は、リモートマシンにログインするユーザーが変更できること.shostsです。別のユーザーとしてリモートマシンにログインできるようにすることはできませんが、リモートマシンへの自分または他のユーザーのアクセスを遮断することはできます。これが懸念事項である場合、あなたは何か.shostsによってのみ書き込み可能にすることができるかもしれませんroot-これがうまくいくかどうかはわかりませんが、試してみることができます。(のような他のメソッドsudoは、ユーザーがいつでも削除できるため、同じリスクの影響を受けます~/.ssh/authorized_keys。)


+1; ユーザーがポート転送、セキュアコピーなど、端末以外のSSH機能を使用する必要がある場合、このオプションは優れた柔軟性を提供すると思います。代替SSHクライアントでも動作するはずです。sudoオプションは...かかわらず、優れたロックダウンされた環境のための可能性
mpontillo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.