====== SSHあれこれ ======
{{tag>linux ssh}}
* [[https://man.openbsd.org/ssh|ssh(1)]]
* [[https://man.openbsd.org/ssh_config.5|ssh_config(5)]]
* [[https://man.openbsd.org/sshd_config.5|sshd_config(5)]]
===== ssh =====
==== パスワードの問合せを行わない ====
ssh -o BatchMode=yes
==== ホスト鍵のチェックを行わない ====
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
''StrictHostKeyChecking=no''でホスト鍵のチェックを抑止して無条件でホスト鍵ファイルを更新。
''UserKnownHostsFile=/dev/null''でホスト鍵ファイルの更新を無効化。
==== 接続タイムアウト、キープアライブ ====
ssh -o ConnectTimeout=30 -o ServerAliveInterval=10
''ConnectTimeout=30''で接続タイムアウトを30秒に変更。
''ServerAliveInterval''秒間隔でkeep-aliveを送信し、''ServerAliveCountMax''回(デフォルト3回)応答が無いと終了するので、
上記の例では30秒無応答なら終了。
==== ログアウト後も接続を維持する ====
ssh -o ControlMaster=auto -o ControlPath="%C" -o ControlPersist=60s
ログアウトした後、60秒間接続を維持する。
複数セッションによる接続の共有が有効になるので注意。ControlPathで作成したソケットを使用して接続を共有できてしまうため、他のユーザがアクセス出来ないディレクトリから実行する。
==== 複数の踏台を経由して接続 ====
例えば、下記のように複数の踏台を経由するネットワークで、''client''から''target''へ''ssh target''で接続したい場合。
+--------+ +----------+ +----------+ +--------+
| client |--------------| gateway2 |--------------| gateway1 |--------------| target |
+--------+ 192.168.3.1+----------+ 192.168.2.1+----------+ 192.168.1.2+--------+
=== 方法1 ProxyCommand ===
Host gateway2
HostName 192.168.3.1
User gw2user
Host gateway1
HostName 192.168.2.1
User gw1user
ProxyCommand ssh -W %h:%p gateway2
Host target
HostName 192.168.1.2
ProxyCommand ssh -W %h:%p gateway1
* ProxyCommandの''-W''は''-CW''でもOK、''-C''はデータ圧縮なので経由するネットワークが細い場合におすすめ
* 踏台も含めて公開鍵を登録しておけば、パスワード無しでログインできる
* 踏台によって公開鍵が異なる場合は''Host''単位に''IdentityFile''で秘密鍵を指定できる??要チェック??
=== 方法2 ProxyJump ===
Host gateway2
HostName 192.168.3.1
User gw2user
Host gateway1
HostName 192.168.2.1
User gw1user
Host target
HostName 192.168.1.2
ProxyJump gateway2,gateway1
''ProxyJump''はコマンドラインオプションの''-J''でも指定可能。
踏み台の認証方法などは''~/.ssh/config''に記述しておく。
ssh -J gateway2,gateway1 192.168.1.2
==== sshをSOCKSプロキシサーバにする ====
gatewayを踏み台にして、SOCKSに対応したアプリで接続する。
ssh -nTND 1080 gateway
''1080''はプロキシのポート番号で任意。
SOCKSに対応したアプリで、
プロキシの種類をSOCKS5に、''localhost:1080''をSOCKSサーバに設定する。
ポート番号の前にコロンを置き'':1080''とすると、全てのインタフェースで接続を受け付ける。
限定したい場合はコロンの前にIPアドレスを記述する。
===== sshd =====
==== ネームサーバが無い環境でSSH接続に時間がかかる ====
sshdサーバの''UseDNS''が''yes''の場合、ネームサーバへの接続がタイムアウトするまで待たされる。
UseDNS no
==== rootユーザでの接続を制限する ====
PermitRootLogin no
''no''だとrootユーザでログインできなくなる。
''prohibit-password''にするとパスワード認証は拒否されるが、公開鍵認証ならログインできる。
''yes''なら制限なし。
===== 公開鍵 =====
==== 公開鍵ファイルの変換 ====
sshで公開鍵を使用した認証は成功しているのに、''key_load_public: invalid format''と警告が出る場合は、
公開鍵ファイルのフォーマットが正しくないか壊れている。
PuTTYとOpenSSHで公開鍵のフォーマットが異なるので、PuTTYのPEM形式のファイルをOpenSSHでも使うと起こる。
=== 秘密鍵ファイルから公開鍵ファイルを作成する ===
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
=== PuTTYの秘密鍵ファイル(PPK形式)をOpenSSHの形式に変換する ===
PuTTYから
- ''File'' > ''Load private key'' > ''id_rsa.ppk''を指定
- ''Conversions'' > ''Export OpenSSH key'' > ''id_rsa''に出力
=== 秘密鍵ファイルから公開鍵ファイル(PEM形式)を作成する ===
ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem
=== 公開鍵ファイルをPEM形式に変換する ===
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem