集中力が10分しか持たないハチワレ先生

集中力が10分しか持たないハチワレ先生

技術メインの雑記ブログ

10 分で入門する SSH(初級編)

こんにちわ、krkettleです
AWS などを利用する上で利用する機会の多い SSH をサクッと紹介していきます
※この記事では OpenSSH について紹介します

この記事を読んで分かること

  • SSH アクセスの方法が分かる
  • キーペア(公開鍵・秘密鍵)の作成方法が分かる
  • SSH の設定ファイル(~/.ssh/config)の基本的な使い方が分かる

前提条件

対象者

  • SSH を使った事がなく、これから使おうと思っている方
  • SSH の細かい仕組みを知る前にまずは使えるようになりたい方
  • Mac 利用者(稼働確認を macOS でしています)

この記事で紹介しないこと

  • SSH サーバ側の説明や設定方法
  • OpenSSH 以外の SSH クライアントについて(PuTTY, TeraTerm など)
  • ssh-agent~/.ssh/configの細かいオプションについて

SSH の仕組みで最低限抑えておくべき内容に関しては以下の記事をご覧下さい

krkettle.hatenablog.com

キーペアの作成

※既にキーペア(一組の公開鍵と秘密鍵)を作成している場合はスキップしてください

mkdir ~/.ssh # .sshディレクトリを作成する
chmod 700 ~/.ssh # パーミッションを変更する

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Enter file in which to save the key:        # 作成したキーをどこに保存する?(デフォルトは$HOME/.ssh/id_rsa)
Enter passphrase (empty for no passphrase): # パスワードは何にする?(デフォルトはパスワード無し)
Enter same passphrase again:                # パスワードもう一回入力してね

デフォルトでは$HOME/.ssh 下に以下の 2 つのファイルが作成されます

  • id_rsa: 秘密鍵(絶対に公開・流出させてはいけない)
  • id_rsa.pub: 公開鍵(他人に公開して問題ない)

また、id_rsa は自分でも修正することが内容にパーミッションを変更しておきます

chmod 400 ~/.ssh/id_rsa

ssh-rsa が非推奨に

OpenSSH 8.3のリリースノートでは 5 万ドル以内 SHA-1 アルゴリズムに対して攻撃可能なため、ssh-rsa を近い将来デフォルトで 無効にするとあります
(OpenSSH 7.2 以降の RSA であればデフォルトで SHA-2 が使われているようです)

It is now possible[1] to perform chosen-prefix attacks against the SHA-1 algorithm for less than USD$50K. For this reason, we will be disabling the "ssh-rsa" public key signature algorithm by default in a near-future release.

そのため、RSA の代わりに ECDSA を選択しても良いでしょう
※一部のレガシーシステムでは ECDSA をサポートしていない場合もあるので要確認

ssh-keygen -t ecdsa -b 521 -C "your_email@example.com"
Enter file in which to save the key:        # 作成したキーをどこに保存する?(デフォルトは$HOME/.ssh/id_ecdsa)
Enter passphrase (empty for no passphrase): # パスワードは何にする?(デフォルトはパスワード無し)
Enter same passphrase again:                # パスワードもう一回入力してね

※以降の章では ECDSA を用いた場合を想定して紹介します

アクセス先への公開鍵登録

アクセス先の~/.ssh/authorized_keys にアクセス元の公開鍵を追記する必要があります
AWS などのパブリッククラウドではサーバ(AWS では EC2)作成時に公開鍵を登録することができます

ssh-copy-id は使わない方が良さそう

ssh-copy-idというコマンドを使うとリモートマシンに公開鍵を登録出来ます

# remote-user: アクセス先のユーザ名
# server-ip: アクセス先の(グローバル)IPアドレス
ssh-copy-id -i id_ecdsa.pub [remote-user]@[server-ip]

しかし、ssh-copy-idではパスワード認証を利用します

ssh-copy-id is a script that uses ssh(1) to log into a remote machine (presumably using a login password, so password authentication should be enabled, unless you've done some clever use of multiple identities).

そのため、SSH 接続先のサーバ側でパスワード認証を有効にする必要がありますが、
SSH 接続において原則パスワード認証は使わない方がよく、公開鍵認証を使うべきです
(※AWS の EC2 ではデフォルトでパスワード認証が禁止されています)

SSH 接続

SSH サーバ側は以下の条件を満たしているとします

  • SSH クライアントから SSH アクセス可能な状態(IP 制限等はなし)
  • 22 番ポートを開放

秘密鍵のパスを指定する

SSH 接続をする上で以下の二つを用いて公開鍵認証を行います

  • 接続元の秘密鍵
  • 接続先の公開鍵

そのため、SSH 接続する際には秘密鍵のパスを指定する必要があります
ただし、以下のパスであれば指定する必要はありません

# -i: 秘密鍵のパスを指定する
ssh -i ~/.ssh/private_key [remote-user]@[server-ip]

アクセスするポート番号を変更する

SSH には 22 番ポートがよく使われます(Well-known Ports)
しかし、セキュリティ的には比較的攻撃されやすいことになるので
SSH 接続に使うポートをサーバ側で変更していることがあります
そのため、クライアント側でも接続先のポートを変更できます

# -p: ポート番号を指定
ssh -p 50022 [remote-user]@[server-ip]

自動切断されないようにする

SSH 接続したまま、しばらく操作しないと接続が切断されます
これを防ぐために一定時間おきに接続先に応答確認を送ります

# -o: 各種オプションを指定
ssh -o ServerAliveInterval=60 [remote-user]@[server-ip]

~/.ssh/config を設定する

引数が多くなってくると毎回コマンドを長々と打つのは面倒ですが
SSH 用の設定ファイル(~/.ssh/config)を作っておけばコマンドを省略できます

Host remote
    HostName remote-ip
    User remote-user
    Port 50022
    IdentityFile ~/.ssh/id_ecdsa
    ServerAliveInterval 60

※remote は任意の名前に変更可能

ssh remote

まとめ

この記事ではキーペアの作成から基本的な SSH 接続の方法を確認しました
再掲ですが、公開鍵認証や電子署名等を確認したい方は以下の記事をご覧ください
krkettle.hatenablog.com