現役Webエンジニアが教える!SSH入門解説
目標
SSHやSCPを使って、リモートサーバーとローカル間の通信ができるようになる。
事前準備
今回は、AWSのEC2に用意したサーバに対してSSHを行います。こちらの詳細は動画内の説明をどうぞ。
SSHとは
SSHとは、Secure Shellの略称で、リモートでコンピューターを操作する際のプロトコルのことを指します。SSHでは、公開鍵認証とパスワード認証のいずれかで通信しますが、今回は「公開鍵認証」を前提に解説していきます。
公開鍵認証では、「秘密鍵」と「公開鍵」の異なる2つの鍵のペアを用意し、これらを使って通信します。秘密鍵は手元で厳重に管理し、公開鍵はリモートアクセスしたいサーバーに設置します。
SSHコマンドの紹介
# 基本のssh接続
ssh -i [秘密鍵] [ユーザ名]@[ホスト名]
事前に用意したAWSのサーバーへSSHで接続してみます。Amazon Linux2のデフォルトユーザはec2-user
で、パブリックIPアドレスは自身で作成したEC2のものを使用します。またここで使用している秘密鍵はサーバー作成時に生成されたものです。
# sshコマンドを使って接続する
ssh -i .ssh/ssh-tutorial.pem ec2-user@[EC2のパブリックIPアドレス]
# 接続に成功すると、以下のようにec2-userで接続している状態になる。
[ec2-user@ip-xxx-xxx-xxx-xxx]$
# ssh接続を終了する
[ec2-user@ip-xxx-xxx-xxx-xxx]$ exit
公開鍵と秘密鍵のペアを作成をして接続
先ほどはサーバー作成時の秘密鍵を使用しましたが、今度は自身のPCで鍵を作成し、それを使用して接続しましょう。SSHの秘密鍵と公開鍵の生成にはssh-keygen
コマンドを利用します。
ssh-keygen
実行するとファイル名の入力が求められます。今回は、ssh_test
というファイル名にしています。ファイル名を指定しないと、id_rsa
というファイル名で作成されます。
Generating public/private rsa key pair
Enter file in which to save the key(/Users/[username]/.ssh/id_rsa): /Users/[username]/.ssh/ssh_test
次にパスフレーズの入力を求められるので、入力しEnterキーを押します。
Enter passphrase(empty for no passphrase):
これで秘密鍵の「ssh_test」と公開鍵の「ssh_test.pub」が作成されました。ちなみに秘密鍵および公開鍵はテキストファイルなので、テキストエディタ等で開いてみることもできます。
次にサーバーに作成した公開鍵を設置します。サーバーのホームディレクトリ直下の.ssh
ディレクトリの中にあるauthorized_keys
というファイルに公開鍵の内容を追加します。authorized_keys
が無い場合は新たにファイルを作成します。
[ec2-user@ip-xxx-xxx-xxx-xxx]$ vim ~/.ssh/authorized_keys
新しく登録したssh_testでSSH接続できるかを確認します。正しく登録されていれば、SSH接続が成功します。
ssh -i .ssh/ssh-test ec2-user@[EC2のパブリックIPアドレス]
[ec2-user@ip-xxx-xxx-xxx-xxx]$
[ec2-user@ip-xxx-xxx-xxx-xxx]$ exit
SSHの設定の際の注意点
秘密鍵や公開鍵のパーミッションによってはSSHの際にエラーとなります。公開鍵は644、秘密鍵600となるようにchmod
でパーミッションを設定しましょう。
https://qiita.com/shisama/items/5f4c4fa768642aad9e06
SCPコマンド
scpコマンドとは、リモートのサーバーとファイルをやりとりするためのコマンドです。次のような形式で使用します。
# サーバーからローカルにファイルを送信
scp -i [秘密鍵] [ユーザ名]@[ホスト名]:[ファイルのパス] [ローカルのパス]
# ローカルからサーバーへファイルを送信
scp -i [秘密鍵] [ローカルのパス] [ユーザ名]@[ホスト名]:[ファイルのパス]
実際にコマンドを実行すると、次のようになります。
- hogeというファイルをローカルからEC2のホームディレクトリに送信する場合
scp -i .ssh/ssh_test hoge ec2-user@[EC2のパブリックIPアドレス]:~/
- EC2上のhogeというファイルをローカルに送信する場合
scp -i ./ssh/ssh_test ec2-user@[EC2のパブリックIPアドレス]:hoge ./
設定の保存
次のような形式でファイルに設定を保存できます。
Host [任意の接続名(ex)hoge]
Hostname [ホスト名]
User [ユーザ名]
Port [ポート番号]
IdentityFile [秘密鍵のPATH (ex) ~/.ssh/hoge.key]
~/.ssh/config
を開いて、先程示した形式で設定を記述します。
vim ~/.ssh/config
Host aws-ssh-host
Hostname [EC2のパブリックIPアドレス]
User ec2-user
Port 22
IdentityFile ~/.ssh/ssh_test
設定したHost(aws-ssh-test)で接続してみます。保存した設定した情報を使って、サーバからローカルにファイルを送信します。
ssh aws-ssh-test
scp aws-ssh-test:hoge ./
多段SSH
多段SSHとは、SSH接続したサーバからさらに他のサーバにSSH接続をすることを言います。また最初に接続したサーバは踏み台サーバと呼んだりします。
以下、privateのEC2に多段SSHでaws-ssh-testを踏み台にして接続する場合を想定します。
~/.ssh/config
ファイルに次のような設定を追加することで、多段SSHが行えます。
vim .ssh/config
========================================
Host aws-ssh-test
HostName [EC2(踏み台)のパブリックIPアドレス]
User ec2-user
Port 22
IdentityFile ~/.ssh/ssh_test
Host private
HostName [EC2(private)のパブリックIPアドレス]
Port 22
User ec2-user
ProxyCommand ssh aws-ssh-test -W %h:%p
IdentityFile ~/.ssh/ssh-tutorial.pem
========================================
ssh private
まとめ
SSH接続によってリモートサーバーとローカル間の通信の仕組み、SSHコマンド、SCPコマンドの使い方や多段SSHについてを解説しました。