SSH

SSH とは

  • セキュアシェル (secure shell)
  • ネットワークを通じて別のコンピュータを安全に遠隔操作するための通信手順
  • さくらVPS のコンソールを触らずとも、Macターミナルで Linux を操作できる

公開鍵と秘密鍵(暗号鍵)

  • 公開鍵 と 秘密鍵(暗号鍵) を組み合わせ、情報を暗号化して送受信できる

SSHクライアント・SSHサーバ

  • SSHクライアント 端末側で利用者が操作するソフトウェア → ローカルの Macターミナル
  • SSHサーバ サーバ側で接続を受け付けるソフトウェア → さくらVPS 上の Linux

接続

  • 接続方法は2種類ある
    • サーバに登録した パスワード を使う
    • 公開鍵/秘密鍵の鍵ペア を使う

パスワード

  • パスワードの使いまわし・漏洩などの問題があるため推奨されない
  • デフォルトでは ssh 接続は公開鍵認証ではなく、パスワード認証されるよう設定されているので注意

公開鍵/秘密鍵

  • 公開鍵:名前に .pub がついた方 (public)

    • サーバにはこちらの公開鍵だけを登録する
  • 秘密鍵:名前に .pub がついていない方

    • 秘密鍵はクライアント側に保存しておく(厳重に管理)

手順

Step 0 (Linux) sshd_config ファイルをバックアップ

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup
  • 最悪、間違って削除などしてしまった場合
    • /usr/share/openssh/sshd_config に元ファイルがあるのでコピーする

Step 1 (Linux) パスワード認証の接続可否を確認する

  • 後ほど作成する公開鍵をサーバ側へ送るためには、パスワード認証が許可されている必要がある
  • 最終的にはパスワード認証を無効化するが、最初は有効化されているか確認する
> sudo vi /etc/ssh/sshd_config
...(省略)
#PasswordAuthentication yes # yesになっているか確認(no なら yes に変更)
...(省略)
ChallengeResponseAuthentication yes # yesになっているか確認(no なら yes に変更)
...(省略)

sshd_config の作法

  • ファイル内は以下のような書き方がされているが、これはコメントではなく、「有効なデフォルト値」を意味する
    • #PasswordAuthentication yes
  • こちらの # を外したり削除しても設定そのものは変わらない
  • こちらを書き換えたい場合は以下のように記述する
#PasswordAuthentication yes
PasswordAuthentication no
# デフォルト値は残しておき、変更後の値とセットにしておく

Step 2 (Linux) ssh を再起動

  • sudo /etc/init.d/ssh restart

Step 3 (Linux) .ssh ディレクトリを作成

Step 4 (Mac) 認証鍵の作成

$ cd ~/.ssh/
$ ssh-keygen -f <鍵の名前> -t ed25519

Enter passphrase: <パスワードを設定する場合は入力して Enter / 不要ならそのまま Enter>
Enter some passphrase again: <上記再入力>

オプションなど

  • パスワード入力を省略するとパスワードなしのキーペアが生成される

    • 基本的にはパスワードなしで良い
  • -f オプション

    • 鍵の名前を指定
    • 省略すると id_xxx id_xxx.pub と言う名前で鍵が生成される
  • -t オプション

    • -t ed25519 で指定する(RSA鍵より強い)
    • ほかに rsa、dsa、ecdsaなどを指定できる
    • 対応している鍵のタイプは「man ssh-keygen」の「-t」の項で確認できる

-bは鍵の暗号化強度(bits)です。鍵の種類によって指定できる強度が異なります。対応している強度は「man ssh-keygen」の「-b」の項で確認してください。
ssh接続を鍵認証で行う

Step 5 (Mac) 作成した鍵を確認

  • ssh-keygen コマンドで .ssh ディレクトリが生成され、その中に認証鍵があるので確認する
  • ls ~/.ssh
    • .pub あり → 公開鍵
    • .pub 無し → 秘密鍵

Step 6 (Mac) 作成した「公開鍵」を Linux サーバに送る

$ user=<ユーザー名>
$ target_host=<サーバホスト名>

$ ssh-copy-id -i <鍵の名前>.pub ${user}@${target_host}

Step 7 (Linux) 受け取った公開鍵のパーミッションを変更

  • 公開鍵をサーバに送ることができると、~/.ssh/authorized_keys という名前でファイルが生成される
  • こちらの権限を変更して、所有者だけが読み書きできるようにする
$ cd ~/.ssh/
$ chmod 600 authorized_keys

Step 8 (Mac) SSH 接続できるか確認

  • $ ssh ${user}@${target_host}
  • 問題なく接続できれば、以降の操作はすべて Macターミナル上から実施できる!!

接続できない場合

Step 9 (Linux on Mac) パスワード認証を無効化

> sudo vi /etc/ssh/sshd_config
...(省略)
#PasswordAuthentication yes
PasswordAuthentication no # noに変更
...(省略)
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no # noに変更
...(省略)

Step 10 (Linux on Mac) ssh を再起動

  • sudo /etc/init.d/ssh restart

Step 11 (Linux on Mac) SSH のポート番号を変更

SSHのポート番号を変更 - SSHサーバーの設定 - Linux入門 - Webkaru

  • SSH のポート番号を変更するために、SSH の設定ファイル /etc/ssh/sshd_config を編集する
> sudo vi /etc/ssh/sshd_config
...(省略)
#Port 22
Port 36254 # ポート番号を書き換え

Step 12 (Linux on Mac) 設定ファイルの構文をチェックする

  • sudo sshd -t
  • エラーが表示されなければOK

Step 13 (Linux on Mac) SSH の設定を反映

  • sudo service sshd restart

Step 14 (Linux on Mac) 設定の確認

  • 新しく変更したポート番号で、SSH ログインできるか確認

    • $ ssh -p <ポート番号> ${user}@${target_host}
    • 通常と同じようにログインできればOK
  • 次に 22番ポートで SSH ログインできないことを確認する

    • 明示的に 22番ポートを指定して、ssh コマンドを実行
    • $ ssh -p 22 ${user}@${target_host}
    • 「Connection refused」というメッセージが表示されればOK

Step 15 (Linux on Mac) root での SSH ログインを禁止する

事前に確認!

※ 今回の設定で、rootでのSSHログインは禁止されます(rootでログインできなくなります)。必ず!一般ユーザーでSSHログインできるかどうかを確認しておきましょう。

  • 上記を確認したら
  • SSH のポート番号の変更と同様に、SSH の設定ファイル /etc/ssh/sshd_config を編集する
> sudo vi /etc/ssh/sshd_config
...(省略)
#PermitRootLogin yes
PermitRootLogin no # rootでのSSHログインを無効化

Step 16 (Linux on Mac) 設定ファイルの構文をチェックする

  • sudo sshd -t
  • エラーが表示されなければOK

Step 17 (Linux on Mac) SSH の設定を反映

  • sudo service sshd restart

これで一通り完成!!

とっても便利な ~/.ssh/config

  • SSH 接続の度に毎回 $ ssh ${user}@${target_host} と書くのは面倒!
  • .ssh/config という設定ファイルを用意しておくと
  • $ ssh <任意の名前> だけで SSH 接続できるようになる!

(Mac) .ssh/config ファイルの作成

  1. $ touch ~/.ssh/config で空白ファイル作成
  2. $ vim ~/.ssh/config でファイルに以下のように記述する
Host hoge
    HostName    os3-333-33333.vs.sakura.ne.jp
    Port        23456
    IdentityFile    ~/.ssh/test
    User        username

補足

  • Host
    • アクセス先につける名前(プロジェクト名とかにすると便利?)
  • Hostname
    • アクセス先のサーバーのホスト名または IP アドレス
  • Port
    • SSH ポートの番号(デフォルト22 から変更したもの)
  • IdentityFile
    • SSH 接続に用いる鍵
    • $ ssh-keygen -f <鍵の名前> -t ed25519 で生成した認証鍵の名前
    • $ ssh-keygen -f test -t ed25519 で作成していれば ~/.ssh/test と記述
  • User
    • ユーザー名(さくらVPS 上で登録したユーザー名)

その他の接続方法

ssh ${user}@${target_host}
ssh -p 22 ${user}@${target_host}
ssh root@${target_host}
ssh -p 23456 ${user}@${target_host}

主要な SSH 操作コマンド

ログイン

  • リモートホスト(SSHサーバー)にログインする場合は、ユーザー名@ホスト名(IPアドレス) の書式で、ログインするアカウントを指定する
$ user=<ユーザー名>
$ target_host=<サーバホスト名>
$ ssh ${user}@${target_host}

ログアウト

  • exit

再起動

  • sudo /etc/init.d/ssh restart
  • sudo systemctl restart ssh

設定を反映

  • service sshd restart

sshd_config の構文チェック

  • sudo sshd -t

その他

IPアドレスについて

IPアドレス192.168.1.100はプライベートIPであり、よく各ブランドやモデルのルーターのゲートウェイアドレスとして使われています。通常、このIPアドレスはルーターとネットワークを構成できるよう、管理者にルーターへのアクセス権を与えます。ただし、すべてのルーターがログイン管理アドレスとして192.168.1.100を使用しているわけではないことにご注意ください。また、192.168.1.100でルーターにログインすると、問題が発生する場合もあります。

IP: 192.168.1.100 ログインページ ユーザー名 パスワード | IPアドレス (日本語) 🔍

不明点

ssh-keygen のオプションの有無による認証鍵生成の挙動の違い

  • オプションなしの場合 : $ ssh-keygen -t ed25519
    • ~/.ssh/ ディレクトリが自動生成され、その中に認証鍵が格納される
  • オプションありの場合 : $ ssh-keygen -f <鍵の名前> -t ed25519

複数のプロジェクトを管理する場合、 ssh-keygen のオプションなしで認証鍵を作るとどうなる?

  • オプションなしで認証鍵を作成すると、id_ed25519.pu id_ed25519.pub という名前で生成される
  • もう一度実行すると以下のように上書きするか聞かれる
/Users/hoge/.ssh/id_ed25519 already exists.
Overwrite (y/n)?
  • 上書きすると最初のプロジェクトで接続できなくなりそうなので、これはつまり複数のプロジェクトでも認証鍵を使い回すということ?