コンテンツにスキップ

ssh関連

ssh client

鍵指定してssh

$ ssh -i ~/.ssh/id_rsa_nopass 192.168.0.31
Last login: Tue Aug 11 14:52:32 2020 from 192.168.0.18
$ 

多段アクセス

追記: 詳細はこちら -> [Linux] ProxyJump設定でSSHの多段アクセスとscp/ポートフォワード - zaki work log

ProxyCommandを使った情報がたくさんヒットするけど、ProxyJump (-J)を使うと簡単。
ローカルから192.168.0.19→172.16.1.0→172.29.0.89という順でssh多段アクセスしたい場合は、以下の通り。

$ ssh 172.29.0.89 -J 192.168.0.19,172.16.1.0

記述の仕方は

ssh ゴール(終着点) -J 踏み台ホストをアクセス順にカンマ区切りで羅列

多段アクセスとポートフォワードのコンボ

-Lで普通に指定すればOK。
機能自体は後述。

上の多段アクセス例であれば、

$ ssh 172.29.0.89 -J 192.168.0.19,172.16.1.0 -L 8899:localhost:8080

とすれば、「172.29.0.89から見たlocalhost:8080」へ対して、「ローカル(sshを実行してる出発点)のlocalhost:8899」をフォワードする。

ポートフォワード

ローカルフォワード

$ ssh rhel8 -L 25080:10.88.250.10:80

rhel8へsshログインしつつ、rhel8から見て10.88.250.10:80へのアクセスをローカルの25080/TCPでListenする。
(ローカルの25080/TCPへアクセスするとrhel8から見た10.88.250.10:80へ転送される)

接続中のエスケープキャラクタ

新しい行で ~ 押下でエスケープキャラクタを送信でき、sshクライアント自体の機能を呼び出せる。

切断する

リモートホストから切断する。
ネットワーク機器などでssh経由のコンソール接続などで exit が打てないような場合に使える。

~.

sshpass

パスワード認証をバッチ処理

sshpass -p $(cat password.txt) ssh user@hostname

sshd

設定ファイルsyntax check

# sshd -t

規定に無い設定キー(というかゴミ)があったりするとエラーになる

# sshd -t
/etc/ssh/sshd_config: line 140: Bad configuration option: a
/etc/ssh/sshd_config: terminating, 1 bad configuration options

有効になる設定のリスト

実行する環境の/etc/ssh/sshd_configの結果、どの設定が適用されるかのすべての内容が表示される。
(/etc/ssh_sshd_configに書かなかったデフォルトの設定含めて出力される)

# sshd -T

デフォルトとの差分を見たい場合は以下で見ようと思えば見れる。

# diff -u <(sshd -T -f /dev/null)  <(sshd -T)

ポート番号の変更

SELinuxが有効の場合はsshdの設定変更だけでは有効にならない。
Port 25022を設定したときに、、

# systemctl restart sshd
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.
# journalctl -xe
sshd[20141]: error: Bind to port 25022 on 0.0.0.0 failed: Permission denied.
sshd[20141]: error: Bind to port 25022 on :: failed: Permission denied.
sshd[20141]: fatal: Cannot bind any address.
systemd[1]: sshd.service: main process exited, code=exited, status=255/n/a
systemd[1]: Failed to start OpenSSH server daemon.

こんなエラーが出る場合は、以下を実行。

# semanage port -a -t ssh_port_t -p tcp 25022

これでsystemctl restart sshdが有効になる。 まぁsshd_configのPortのすぐ上にコメントで書かれてるんだけど。

鍵管理

キーペア作成

  • -f で作成先鍵ファイル (デフォルトは$HOME/.ssh/id_***)
  • -N でパスフレーズ (デフォルトは対話的に聞かれる)
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa_nopass -N "" -C "comments"
Generating public/private rsa key pair.
Your identification has been saved in /home/zaki/.ssh/id_rsa_nopass.
Your public key has been saved in /home/zaki/.ssh/id_rsa_nopass.pub.
The key fingerprint is:
SHA256:vDhmhHyGepTu929HGu0oPPKS/2HrJexF97CBWu9k0M4 zaki@cloud-dev
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|   . + .     o   |
|    * + S  .= =  |
|   + + . o.+o* = |
|  . o =o. **o E .|
|   o o=.+o+*o+   |
|    .. *+B*.  .  |
+----[SHA256]-----+
$ ls ~/.ssh/
id_rsa  id_rsa.pub  id_rsa_nopass  id_rsa_nopass.pub  known_hosts

リモートへ公開鍵コピー

$ ssh-copy-id -i ~/.ssh/id_rsa_nopass 192.168.0.31
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/zaki/.ssh/id_rsa_nopass.pub"
The authenticity of host '192.168.0.31 (192.168.0.31)' can't be established.
ECDSA key fingerprint is SHA256:WQpvcX7UfYAmdFIMfhak4pCevQvOjZkIZ/fpE4Sofm4.
ECDSA key fingerprint is MD5:97:15:37:72:88:ab:59:01:ad:3c:a2:e9:10:90:11:59.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
zaki@192.168.0.31's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.0.31'"
and check to make sure that only the key(s) you wanted were added.

$

フィンガープリント確認

$ ssh-keygen -l -f ~/.ssh/id_rsa.pub
4096 SHA256:6Qt0+Nikcx/NpgM4xu/4WnDpqhj8L+OjtDEP5O2a7lw no comment (RSA)

秘密鍵から公開鍵を作成

$ ssh-keygen -y -f ~/.ssh/id_rsa

STDOUTへ出力されるので、> id_rsa.pubとかファイルへ出力すればOK

パスフレーズ変更

ssh-keygen -f <private-key> -p
$ ssh-keygen -f /path/to/id_rsa -p
Enter old passphrase:
Key has comment ''
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

空入力すればパスフレーズを解除できる

鍵形式の指定

デフォルトでは以下で始まるOpenSSH形式で作成される。

-----BEGIN OPENSSH PRIVATE KEY-----

-mを使うと、形式を指定できる。
PEM形式であれば以下の通り。

$ ssh-keygen -m PEM

出力される鍵は以下で始まる。

-----BEGIN RSA PRIVATE KEY-----

鍵形式の変更

秘密鍵

-pを使ったパスフレーズ更新の際に、-mで鍵形式を指定することで変換できる。
実行することで鍵ファイルが更新される。
PEM形式に変換するのであれば以下の通り。

$ ssh-keygen -p -m PEM -f ~/.ssh/id_rsa

デフォルトはRFC4716。OpenSSH形式にする場合は、-m RFC4716を指定すればOK

公開鍵

OpenSSH形式(ssh-rsaなどで始まる1行の書式) -> PEM形式(BEGIN PUBLIC KEYからENDまでの複数行形式)

$ ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8

PEM形式 -> OpenSSH形式

$ ssh-keygen -f ~/.ssh/id_rsa.pub -i -m PKCS8

「OpenSSH形式と〇〇の変換」で、出力(-eexport)や入力(-iimport)の鍵形式を-mで指定するっぽい。(片方は指定できるがもう片方はOpenSSH形式固定)

鍵サイズ指定

-bで指定する。

$ ssh-keygen -t rsa -b 4096

ssh-copy-id

$ ssh-copy-id [-i identity_file] [-p port] [username@]hostname

scp

メタ文字のエスケープ

クォートが無いとエラーになる

scp server:'/path/to/file\(...\)' dest

ディレクトリのコピー

-rを付与して再帰コピーする

scp -r src dst

属性維持してコピー

-pを付与する。

scp -p src dst

ワイルドカード

リモートのファイル・ディレクトリに対してもワイルドカートは有効。
ただしローカルに同じパスがあるとローカル側で展開されてしまうのでクォートで囲んでおくのが無難。

scp -pr 192.168.1.10:"/path/to/file*" .

その他