ssh まとめ ~/.ssh/config 書き方等

いつも新しいPCに設定する時迷うので、以下の4点についてまとめました。

  • ~/.ssh/configの書き方
  • Xserverへの接続方法
  • ホストとクライアントの秘密鍵と公開鍵の場所
  • パスワード認証不可設定方法

~/.ssh/config

SSH接続設定リストを書いておくファイルです。 これを書いておくとコマンドプロンプトから簡単に接続できますし、VScodeからも簡単に接続できるので、お薦めです。

  • Host ---この右に書くのは自分で分かりやすい名前を付ける。 
    • VScodeの画面にはこの右に書くHost名が表示される。 したの例ではpi4やgithub22rpやTokyoなど。
  • User —–ssh接続した時にログインするユーザー名。 
    • 下の例では、ラズパイにはユーザー名piでログインする。
  • Port —ssh接続する時のポート番号。 
    • 何も指定が無ければデフォルトの22。 Xserverの場合は10022を指定する。 普通のgithub.comならポート22だが、ssh.が先頭につくとポート443になる。 443の場合、『https://github.com』で接続し、 22の時は『git@github.com:』で接続する。
  • IdentityFile — 公開鍵認証用の秘密鍵ファイルのパスを指定する。
    • ログインパスワードによる認証よりセキュリティが高く推奨される方法。
  • ProxyCommand — 多段接続する時に使用します。
    • 下の例は、pi4を踏み台(経由=Port Forward=ポート転送)にしてgithubに接続する。
  • PasswordAuthentication — ログインパスワードでSSH接続をする場合
    • yes/noを設定する。 (初期値はyes)
    • 公開鍵認証よりセキュリティが高くないので、最初はログインパスワードで接続し、接続したリモートホストで秘密鍵を作り、秘密鍵をscpでリモートホストからローカルマシンに送ってディレクトリ(=フォルダ)に保存するのが良い。 サーバーとなるリモートホストで秘密鍵を生成する際に公開鍵も同時に生成されるので、公開鍵ファイルを開いて、中身を全てサーバーの『~/.ssh/authorized_keys』ファイルに追加貼付けします。
    • IdentityFileで秘密鍵を設定しても、PasswordAuthentication noとしていないと、パスワードでのログインもOKとなる。
Host pi4
    HostName 192.168.11.4
    User pi
    Port 22
    #ラズパイで生成してWindowsに保存した秘密鍵ファイルのパス
    IdentityFile ~/Documents/IoT/Raspi/id_rsa

Host github22rp
    User git
    Hostname github.com
    Port 22
    IdentityFile ~/Documents/IoT/git/.ssh2/git_ed_key
    ProxyCommand ssh -W %h:%p pi4

Host github443
    User git
    Hostname ssh.github.com
    Port 443
    IdentityFile ~/Documents/IoT/git/.ssh2/git_ed_key

Host Tokyo
    HostName 10.73.105.101
    User ichiri
    Port 22
    PasswordAuthentication yes

XserverへのSSH接続

  • Xserverはログインパスワードでの接続はできず、秘密鍵での接続しかできない。
  • 秘密鍵は、Xserverのアカウントサイトで生成しダウンロードする。

パスフレーズはログインパスワードとは異なります。 公開鍵認証での接続の場合、パスフレーズを聞かれるのでメモっておきましょう。

この画面になるので『生成する』をクリック。

  • 秘密鍵は自動的にダウンロードされるので、好きなディレクトリに保存します。 ファイル名は変更しても構いません。
  • 公開鍵は画面に表示されるのでコピーして、『公開鍵登録・更新』タブを開いて、テキストボックスエリアに貼り付けて『確認画面へ進む』をクリック。
  • これで、公開鍵を『~/.ssh/authorized_keys』ファイルに追加で貼り付けてくれます。(私は、一回秘密鍵を無くして2度生成しているので、公開鍵も2つ入っているんでしょうね。
  • Windows PCの~\.ssh\configファイルに以下の様に設定する。
  • 秘密鍵ファイルは,xserver_secrete072.key等、適当なファイル名にしています。
  • HostNameに記述するドメイン名は、『サーバー番号』に.xserver.jpを付ける。
  • Userには、『サーバーID』をコピペする。
  • Port —10022
~\.ssh\config
Host xserver
     HostName sv13999.xserver.jp
     User xs499990
     Port 10022
     IdentityFile ~\Documents\IoT\Xserver\xserver_secrete072.key

サーバー番号とサーバーIDはサーバーパネルに表示されています。 HostNameはサーバー情報入るとフルパスで確認できます。

鍵生成場所(サーバー? 自分のPC(クライアント)?)

  • どちらでssh-keygenで鍵を生成しても構いません。
  • ssh-keygenを実行すると、~/.ssh/ディレクトリに秘密鍵と公開鍵が生成されます。
  • 秘密鍵は、クライアントに保存します。 秘密鍵のファイル名は何でも構いません。 ディレクトリも何処でも構いません。
  • 公開鍵の中身は、サーバーの『~/.ssh/authorized_keys』ファイルに追加で貼り付けます。 サーバの『authorized_keys』ファイルは、複数クライアント相手の公開鍵を保存しておき、sshdが参照するのでファイル名もディレクトリ場所も『~/.ssh/』固定です。 公開鍵のファイルは使用されないので、ファイル名は何でも構いません。
  • Xserverの場合は、サーバーでしか鍵を生成できません。
  • 自分のPCで鍵を生成したら、その公開鍵を複数のsshサーバーのそれぞれの『~/.ssh/authorized_keys』ファイルに追加すれば、自分のPCで複数のsshサーバーに接続する為の秘密鍵は1つで済みます。 N(サーバー):1(クライアント:自分)
  • 逆に、サーバーで公開鍵と秘密鍵を生成して、秘密鍵を複数のクライアントに配ると1(サーバー):N(クライアント)になります。 自分のXserverアカウントに、複数PCやタブレットで接続する際は、この方法を使います。
  • 因みにサーバーで鍵を生成して秘密鍵をクライアントに送ったら、サーバーから秘密鍵を消すのがセキュリティ的にはより安全です。

ssh-keygen (鍵生成コマンド)

  • -t オプションを付けて暗号化方法を指定します。 RSA4096でもセキュリティが十分でなく非推奨となってしまったので、私はed25519暗号化を使っています。
  • 鍵のfile名と保存するディレクトリを聞かれますが、ファイル名だけ入力してEnterとしています。
  • passphraseを2回聞かれるので同じpassphraseを入力します。 何も入力しなくてもいいですが、セキュリティ強化にはpassphraseがあった方がいいです。 最初のssh接続の時にpassphraseを聞かれます。
  • ファイルが出来ていますね。 id_ed25519_test.pubが公開鍵(public key)です。 id_ed25519_testが秘密鍵です。
$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/ichiri/.ssh/id_ed25519):id_ed25519_test
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:YunRIGvmRCMIpE1KNTbF3XMxBn/7NfAmoBsUeaiUUC8 root@c8cb999d1821
The key's randomart image is:
+--[ED25519 256]--+
|ooo=oo+.oo++.    |
|+=. o. +.=+o.    |
|+ o + oE.o+o o   |
|   o + =o . o +  |
|    = = So   o +.|
|   = o o  o   + o|
|    . .  .     . |
|                 |
|                 |
+----[SHA256]-----+
$ ls ~/.ssh
id_ed25519_test  id_ed25519_test.pub

公開鍵をサーバーの『~/.ssh/authorized_keys』ファイルに追加します。

$ cd ~/.ssh
$ echo `id_ed25519_test.pub` >> authorized_keys

或いは、catで公開鍵を表示して、その公開鍵情報をコピーして、echoコマンドに張り付けてauthorized_keysに追加しても同じ事ができます。

$ cat ~/.ssh/id_ed25519_test.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK3x/Oy8EVoHmVm6bix48/bVnu6L62gusc5Yt0RjTcgt ichiri@c8cb999d1821

echo 公開鍵 >> ~/.ssh/authorized_keys で公開鍵をauthorized_keysに追加してくれます。 viやnanoで追記してもOKです。

$ echo ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK3x/Oy8EVoHmVm6bix48/bVnu6L62gusc5Yt0RjTcgt ichiri@c8cb999d1821 >> ~/.ssh/authorized_keys

クライアントで作った公開鍵をサーバーに登録する方法

上記の様に手動でサーバーの~/.ssh/authorized_keysに貼り付けてもいいですが、以下の方法でも可能です。

$ sudo ssh-copy-id -i <pub_key_file> <user_name>@<server_ip_address>

//例
$ sudo ssh-copy-id -i /root/.ssh/id_ed25519.pub ichiri@192.168.11.8

// ssh-copy-idが使えない場合
$ cat ~/.ssh/id_ed25519.pub | sudo ssh <user_name>@<server_ip_address> "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"

サーバー側 パスワード認証不可設定

Linuxは初期設定ではsshのパスワード認証は可能です。 最初はパスワード認証を可能としておかないとssh通信で公開鍵をクライアントからサーバーに送れませんし、秘密鍵をサーバーから取ってこれません。 なので最初はパスワード認証可にしておいて、公開鍵と秘密鍵での接続が出来る様になると、悪意を持った第三者がパスワード認証で接続しないように、サーバーのパスワード認証を不可にするのがよいのです。 /etc/ssh/sshd_config 設定ファイルの『PasswordAuthentication yes』を『PasswordAuthentication no』に変更します。

sshで接続して、viやnanoで編集するのが手っ取り早いですが、sshで接続後、sedで文字列を置き替えても変更できます。 『PasswordAuthentication no』に変更したら、sshdを再起動して変更を読み込ませましょう。

$ sudo sed -i 's/^PasswordAuthentication yes$/PasswordAuthentication no/' /etc/ssh/sshd_config
$ sudo systemctl restart sshd

ssh接続方法

192.168.11.8のPCのichiriユーザーにssh接続する時、ユーザー名@IPアドレスで接続できます。 パスワード認証の時は、ログインするユーザーのログインパスワードを聞いてきます。 公開鍵認証の時は、公開鍵のパスフレーズを聞いてくる事があります。

$ sudo ssh ichiri@192.168.11.8

scp Secure Copy

192.168.11.8のPCのichiriユーザーの/home/ichiri/gm1からファイルをscpで取ってローカルPCのカレントディレクトリに保存する時。(scpはsshと同じプロトコルを使っています。) scpはssh接続していない状態で実施します。

$ sudo scp ichiri@192.168.11.8:~/gm1/*.* .

おしまい

コメント