SSH とは
- セキュアシェル (secure shell)
- ネットワークを通じて別のコンピュータを安全に遠隔操作するための通信手順
- 主に Linux などの UNIX 系 OS で利用される
- 通信経路が暗号化されるため、インターネットなどを経由しても安全にアクセスできる
- SSH(セキュアシェル)とは - 意味をわかりやすく - IT用語辞典 e-Words
- さくらVPS のコンソールを触らずとも、Macターミナルで Linux を操作できる
公開鍵と秘密鍵(暗号鍵)
公開鍵
と秘密鍵(暗号鍵)
を組み合わせ、情報を暗号化して送受信できる
SSHクライアント・SSHサーバ
SSHクライアント
端末側で利用者が操作するソフトウェア → ローカルの MacターミナルSSHサーバ
サーバ側で接続を受け付けるソフトウェア → さくらVPS 上の Linux
接続
- 接続方法は2種類ある
- サーバに登録した
パスワード
を使う 公開鍵/秘密鍵の鍵ペア
を使う
- サーバに登録した
パスワード
- パスワードの使いまわし・漏洩などの問題があるため推奨されない
- デフォルトでは ssh 接続は公開鍵認証ではなく、パスワード認証されるよう設定されているので注意
公開鍵/秘密鍵
公開鍵:名前に
.pub
がついた方 (public)- サーバにはこちらの公開鍵だけを登録する
秘密鍵:名前に
.pub
がついていない方- 秘密鍵はクライアント側に保存しておく(厳重に管理)
手順
- 以下の記事を参考にして実施した記録
Step 0 (Linux) sshd_config
ファイルをバックアップ
ssh_config
とsshd_config
ファイルがあるので間違えないよう注意sshd_config
ファイルは、ポート番号を指定したりパスワードログインを許可するかなど、SSH 接続において重要なファイルとなるため、事前にコピーしてバックアップをとっておく
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
ディレクトリを作成
$ mkdir ~/.ssh/
$ chmod 700 ~/.ssh
700
自分のみ全権を付与- chmod パーミッション一覧
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 サーバに送る
ssh-copy-id
コマンドを使うと簡単に送ることができる
$ 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ターミナル上から実施できる!!
接続できない場合
- 接続できない場合はパーミッションを真っ先に疑う
- 接続エラーのログは、サーバ側の
/var/log/secure
で確認できる$ cat /var/log/secure
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 の設定ファイル
/etc/ssh/sshd_config
を編集する
> sudo vi /etc/ssh/sshd_config
...(省略)
#Port 22
Port 36254 # ポート番号を書き換え
- Port は
0 ~ 1023番
は使用しない- ウェルノウンポートは使用しない
- ウェルノウンポート:「ポート番号のうち、著名なサービスやプロトコルが利用するために予約されている0番から1023番のこと」
- ウェルノウンポート(well-knownポート)とは - 意味をわかりやすく - IT用語辞典 e-Words
- ウェルノウンポートは使用しない
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
ファイルの作成
$ touch ~/.ssh/config
で空白ファイル作成$ vim ~/.ssh/config
でファイルに以下のように記述する
Host hoge
HostName os3-333-33333.vs.sakura.ne.jp
Port 23456
IdentityFile ~/.ssh/test
User username
- この設定以降は
$ ssh hoge
だけで SSH 接続できるようになる! - 細かい内容は以下を参照
補足
- 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でルーターにログインすると、問題が発生する場合もあります。
不明点
ssh-keygen
のオプションの有無による認証鍵生成の挙動の違い
- オプションなしの場合 :
$ ssh-keygen -t ed25519
~/.ssh/
ディレクトリが自動生成され、その中に認証鍵が格納される
- オプションありの場合 :
$ ssh-keygen -f <鍵の名前> -t ed25519
~/.ssh/
ディレクトリは生成されず、認証鍵はホームディレクトリに生成される- 予め
~/.ssh/
ディレクトリに移動しておけばよい?
- 予め
複数のプロジェクトを管理する場合、 ssh-keygen
のオプションなしで認証鍵を作るとどうなる?
- オプションなしで認証鍵を作成すると、
id_ed25519.pu
id_ed25519.pub
という名前で生成される - もう一度実行すると以下のように上書きするか聞かれる
/Users/hoge/.ssh/id_ed25519 already exists.
Overwrite (y/n)?
- 上書きすると最初のプロジェクトで接続できなくなりそうなので、これはつまり複数のプロジェクトでも認証鍵を使い回すということ?