要塞サーバー:TCP転送VSを使用してサーバーに秘密キーを配置する


10

要塞サーバーBがあります。秘密鍵を使用して、AからBを介してCにSSHで接続する必要があります。

より良いオプションは何ですか:

  • 入れてサーバー上の秘密SSHキー我々は、それが本番環境でそれを行うには悪いアイデアだと読みB.を。

    ここから:

    SSH秘密鍵を踏み台インスタンスに配置しないでください。代わりに、SSHエージェント転送を使用して、最初に要塞に接続し、そこからプライベートサブネット内の他のインスタンスに接続します。これにより、SSH秘密鍵をコンピューター上だけに保持できます。

  • SSHエージェント転送を使用します。エージェント転送を設定するには、TCP転送を許可する必要があります。エージェント転送を設定すると、転送ホストにソケットファイルが作成されます。これは、キーを宛先に転送できるメカニズムです。AWSの要塞設定で:

    TCP転送:この値をtrueに設定すると、TCP転送(SSHトンネリング)が有効になります。これは非常に便利ですが、セキュリティ上のリスクもあるため、必要でない限り、デフォルト(無効)の設定を維持することをお勧めします。

    ここからも:

    有害と見なされるSSHエージェント転送

何が良いですか?2番目のリンクからの代替:ProxyCommandについてはどうですか?それはソケットファイルの問題に役立つことを理解していますが、それでもTCP転送を有効にする必要があると思うので、十分に安全ですか?


2
ProxyCommandを使用すると、TCP転送を有効にする必要はありません。転送は中間ホストのsshによって行われます。
ウルテル

ありがとう。設定ファイルはどうあるべきですか?私のコンピュータまたは要塞の?
user2503775

ssh hostbコマンドを入力するローカルシステムで、ローカル構成でhostbを検索し、hosta経由で接続する必要があることを認識できるようにします。あなたが設定をhostaに置くならばそれはそれをすることができませんでした...
wurtel

サーバーCの秘密鍵はどこに保存されますか?私のコンプでも?keeAgentでkeepassを使用しています
user2503775

2
TCP転送エージェント転送を混同していると思います。彼らは違うものです。
Mlu

回答:


13

ProxyCommandまたはProxyJumpを使用する

私は使用することをお勧めしますProxyCommand(またはProxyJump構文は簡単ですが、クライアント側ではopenssh 7.3以降が必要であるためさらに優れています)。また、要塞に秘密鍵をデプロイする必要はなく、すべてローカルのままです。

ProxyJumpの例

クライアントコンピューター~/.ssh/configで、次のような内容のファイルを書き込みます。

Host bastion
  HostName bastion.example.com
  User bastion-user
  Port 22
  IdentityFile ~/.ssh/id_bastion

Host srvC
  HostName srvC.local
  User server-user
  IdentityFile ~/.ssh/id_protected_lan
  ProxyJump bastion

次に、ssh srvCエージェント転送や要塞への秘密鍵のデプロイなしで、B(要塞)を介してCに接続します。

上記の例では、「bastion」はBastionホストのエイリアスであり、srvCはサーバーCのエイリアスです。には、ホストのHostNameIPまたは実際の完全修飾ドメイン名を入力する必要があります。ユーザーの場合Userは、要塞とサーバーCで正しいログイン名に更新する必要があります。IdentityFileローカルエージェント(KeeAgentやssh-agentなど)を使用している場合、これはオプションですが、実行されていない場合は、作業し、各キーパスフレーズを尋ねます。

公開鍵の配備

もちろん、公開鍵を要塞とsrvCの両方にデプロイする必要があります。使用できます($記号はプロンプトを説明するためのものであり、入力しないでください)。

$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   srvC

注:上記は、パスワード認証が引き続き許可されている場合にのみ機能します。上記の展開とすべてが意図したとおりに機能することを確認したら、2台のサーバーでのパスワード認証を禁止する必要があります。

ProxyJumpの代わりにProxyCommandを使用した例

ProxyJump(クライアント側で)サポートしていない古いバージョンのOpenSSHを使用している場合は、次のものを置き換えます。

ProxyJump bastion

沿って

ProxyCommand ssh -q -W %h:%p bastion

私が理解している限り、これは似ています。


ありがとうございました!私はLinuxを使用していますが、Windowsで作業しているチームメンバーもいます。そこでも機能するはずですよね。
user2503775

彼らはどのSSHクライアントを使用しますか?OpenSSH(WSL、またはcygwinなどを介して)またはMobaXtermのようなPuTTY(またはPuTTYに基づく別のツール)?
ホイヘンス

PuTTyを使用するものもあれば、Git Shell経由でsshを使用するものもあります。
user2503775

@ user2503775私はPuTTYで試したことはありませんが、ProxyCommandアプローチを使用して可能であるようです。ここを参照してください:stackoverflow.com/a/28937185
Huygens

1
詳細な回答ありがとうございました!
user2503775

5

ProxyJumpに関する答えを見ました。ProxyCommandについて話しましょう。

しかし、待って、待って!エージェント転送を使用するサーバーをハッキングする方法を説明します。これにより、違いを理解しやすくなります。

ハックしよう!

基本的な手順については、私の投稿をここで読むことができます

基本的な手順は次のとおりです。

  1. 要塞ユーザーを作成する
  2. rootログインを無効にする
  3. ハッキングの試みをブロックする
  4. ポートを変更
  5. ファイアウォールを構成する
  6. SELinuxを設定する

AgentForwardingの使い方

-〜/ .ssh / configに設定を作成

  Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

-認証キーをssh-agentに追加します

ssh-add ~/.ssh/name_rsa

-要塞ホスに接続

ssh bast

-要塞からアプリケーションサーバーを接続する

 ssh app@IP -p PORT

ハッキング!

あなたはまあ、私に質問をするかもしれません:

  • サーバーは安全ですか?そして答えは非常に簡単です:

    • 番号!
  • どうして?

    • SSHエージェント転送を使用しているため!
  • そして、問題はどこにありますか?

    • エージェント転送は危険であり、有害と見なされているためです。
  • どうして?

    • すべてを裏返しに説明しましょう:要塞ホストに接続すると、栄光のsshエージェントが転送されます。これは、誰かがこのソケットデータを使用してサーバーにアクセスできるようにソケットが設定されることを意味します。あなたの要塞サーバーが危険にさらされていると想像してください。もし誰かがあなたのLinuxサーバーで十分な権限を持っているなら、彼/彼女はあなたのソケット情報を使うだけです。その結果、すべてのサーバーにアクセスできます。要塞ホストに接続している時間の長さに依存するため、妥協のウィンドウが非常に小さいことを知っています。しかし、ProxyCommandなどの他のオプションがある場合、本当にリスクを冒しますか?したがって、ProxyCommandを使用してください!

要塞ホストを危険にさらした場合、サーバーをハッキングする方法は?

トラックターゲット

/ tmpディレクトリには、次のようなものがあります。

[root@localhost tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo

一時ファイルを開いてみましょう

[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep  7 17:35 agent.10507

このプロセスIDへの接続を見てみましょう。

netstat -nxp | grep  10507

結果:

unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion

そして、誰が接続されていますか?

lsof -i -a -p 10507

結果:

COMMAND  PID   USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd    10507 bastion  3u  IPv4 501301  0t0  TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)

ソケットファイルも確認できます。

cd /proc/10507/fd/
ls

結果:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

そして、クライアントリモートサーバーに接続されるどうなりますか?どれどれ:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

netstatを使用してソケットファイルが使用されているかどうかを確認することもできます。

unix  3 [ ]  STREAM  CONNECTED  502267  10561/sshd: 
                     bastion  /tmp/ssh-oVoMXC6vb8/agent.10561
unix  3  [ ] STREAM     CONNECTED     502072   10561/sshd:  bastion 

ソケット情報とIPアドレスを盗む

次に、要塞ホストのセッションが開いている間にソケット情報を盗む必要があります。ああ、宛先サーバーのIPも必要なので、netstatを使用します。

netstat -tn

最後のステップを使用するには、転送ソケットファイルを

eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507

キーが読み込まれているかどうかを確認します

ssh-add -l

結果はそのようなものになるはずです

2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)

サーバーはハッキングされていますが、セキュリティの問題を修正するにはどうすればよいですか?

プロキシコマンド

Host app
    Hostname *.*.*.*
    IdentityFile ~/.ssh/your_rsa
    User *******
    Port ****
    ProxyCommand ssh -W %h:%p bast

Host bast
     Hostname *.*.*.*
     ForwardAgent no
     User ******

基本的な操作:サーバーを介してファイルを転送する方法(クライアントからサーバー、サーバーからクライアント)、ここの私の投稿読むことができます

結論

  • 要塞ホストを使用する場合は、AgentForwardingを使用せず、ProxyCommandを使用してください
  • 認証には常に非rootユーザーを使用する
  • ファイアウォールを使用して、不要な接続をすべてブロックします。
  • SELinuxを使用する(一般)
  • 不正な認証情報で数回ログインしようとするIPアドレスをブロックする
  • 必要がない場合は、ユーザーにsudo権限を付与しないでください。
  • サーバーを監視する
  • セキュリティパッチのためにサーバーを更新する

詳細については、私のブログを参照してください。さらに、私はいくつかのスクリーンショットを持っているので、あなたのために役立つかもしれません。


どうもありがとうございました!実際には、ログイン時にgoogleオーセンティケーターも使用しています。
user2503775

sshアプリを呼び出そうとすると、エラーが発生します:channel 0: open failed: administratively prohibited: open failed. stdio forwarding failed. 。理由はありますか?安全なログで私は見る:refused local port forward: originator 127.0.0.1 port 65535, target *app-ip* port 22
user2503775

クールな情報。回答の読みやすさを向上させるための小さなアドバイス。ここにブログのコンテンツをコピーして貼り付けないでください。リンクと概要のみを提供します。次に、実際の回答部分(ProxyCommandを使用している)を強調表示します。初めはあなたがそれを試してみたのを見たが、コピー/貼り付けの部分が与えられたので、それはちょっと混乱していた。とにかく+1
ホイヘンス

@ user2503775別の問題であり、関連するssh-agent forwarding / proxyコマンドではないはずです。ログで新しい質問を開きましょう。
grep


4

他のほとんどの場合と同様に、SSHエージェント転送を使用するだけです。

  • キーは、ラップトップのsshエージェントにあります。
  • 要塞にログインし、エージェントによって認証されます。
  • そこからターゲットホストにログインし、認証リクエストをラップトップに転送します

利点:悪用される可能性のあるキーが要塞に保存されていません。

それが役に立てば幸い:)


こんにちは、それは基本的にOPが彼/彼女の2番目の弾丸で説明するものです。質問の2番目のリンクを確認することをお勧めします。
Huygens

@Huygens true私は今気づいた。彼がTCP転送とエージェント転送を混ぜ合わせているので、私はそれを無視しました。
Mlu

確かにこれは混同されています:-)
Huygens

混合されていません。違いがわかります。質問を明確にするために編集しました。
user2503775

エージェント転送をハッキングする方法を回答しました(キーはありませんが、ソケットは開いています)。キーを盗む可能性は非常に低いため、通常、エージェントの転送は問題ありません。まず、要塞ホストをハックする必要があります。とにかくあなたは私の答えを見ることができます:serverfault.com/a/958466/476642
grep
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.