現役Webエンジニアが教える!SSH入門解説

公開日:2022-07-11
SSH
インフラ

https://www.youtube.com/watch?v=JBzFNA2OX3o

目標

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/5f4c4fa768642aad9e06https://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についてを解説しました。