📌

SSHの基礎知識

2023/04/10に公開

sshについて

今日はローカル開発環境でもAWSを学習するのにもほぼ必須と言っていいほど必要な技術"ssh"について,
仕組みから実践コマンドまでやっていこうと思います。

ssh(Secure Shell)とは

  • Secure Shellの略称で、暗号化通信により安全なリモートログインを実現するためのプロトコル
    SSHを利用することで、外部からセキュアにサーバーにアクセスすることができる。

sshの仕組み

仕組みを理解するにも、言葉を理解しないと始まらないので、以下のタブに用語を解説します。
ここで出てくる必須の単語は以下の通りです。

SSHに関する記事やドキュメントをより理解しやすくなる!用語集
  • 公開鍵暗号方式(Public key cryptography):
    SSHは公開鍵暗号方式を使用している。これは、暗号化に公開鍵、復号に秘密鍵を使用する方式。

  • 秘密鍵(Private key):
    公開鍵暗号方式で暗号化されたデータを復号するために必要な鍵です。セキュアに保管する必要がある。

  • 公開鍵(Public key):
    暗号化に使用される鍵。公開鍵は、他の人に共有することができます。

  • SSHクライアント(SSH client):
    SSHクライアントは、SSHサーバーに接続するために使用されるソフトウェアです。

  • SSHサーバー(ssh server):
    SSHサーバーは、SSHクライアントからの接続を受け付け、認証を行い、セッションを確立するサーバーソフトウェア。

  • ポートフォワーディング(Port forwarding):
    SSHを使用してローカルネットワーク内のサービスを外部からアクセス可能にするための仕組み。
    ネットワーク内のあるサーバーに対して、外部のユーザーが直接アクセスできない場合に、
    別のサーバーを経由してアクセス可能にするための仕組みです。

https://qiita.com/miyuki_samitani/items/07c8b05f74dca25b33d0

  • SSHトンネリング(SSH tunneling):
    SSHトンネリングは、SSHを使用して、ネットワーク上を通信するデータを暗号化することができる仕組み。

SSH接続をするためには、以下の手順が必要。

1. 自分のPCで「秘密鍵」、「公開鍵」を作成
SSH接続をする前に、自分のPCで秘密鍵と公開鍵のペアを作成する。
秘密鍵は自分のPCに保存しておき、公開鍵はリモートサーバーに登録。

2. 接続したいサーバに作成した「公開鍵」を置く
自分のPCで作成した公開鍵を、接続したいサーバに置く。
これにより、サーバは自分の秘密鍵で暗号化されたメッセージを送信してきたクライアントを識別する。

3. PC側からサーバにSSH接続したいと伝える
SSH接続を開始するには、自分のPCからサーバに接続する必要がある。
これは通常、SSHクライアントソフトウェアを使用して行われます。
SSHクライアントは、サーバに接続する前に、接続に必要な情報を要求します。

4. サーバ側で「乱数」を生成
サーバは、接続を確立する前に乱数を生成。この乱数は、接続に使用される暗号キーの生成に必要。

乱数(Random Number):
SSH接続の際に使用される、ランダムに生成された数字のこと。
この乱数は、セキュリティ上の目的で使用され、鍵交換プロトコルや暗号化などで使用。
乱数は、毎回異なる値が生成されるため、予測することは不能。

5. サーバ側で「乱数」と、2の「公開鍵」を使って暗号を作って、暗号をPC側に送る
サーバは、自分の秘密鍵を使用して、乱数とクライアントの公開鍵から暗号キーを生成し、
その暗号キーで暗号化したメッセージをクライアントに送信。

6. 暗号を受け取ったPC側は「秘密鍵」を使って、暗号を複合して「乱数」を取り出す
PCは、自分の秘密鍵を使用して、サーバから受信した暗号メッセージを復号化。
これにより、クライアントが接続に使用するための乱数が取得される。

7. さらにPC側は取り出した「乱数」からハッシュ値を生成しサーバへ送る
PCは、取得した乱数を使用してハッシュ値を生成し、それをサーバに送信。
このハッシュ値は、後で確認するために使用される。

ハッシュ値(Hash Value):
データの特定の形式に変換された値であり、ハッシュ関数を使用して生成。
ハッシュ値は、元のデータから計算することができず、同じデータからは必ず同じ値が生成されるため、
データの整合性の確認に用いられる。

8. サーバ側で「乱数」からハッシュ値を生成
サーバは、自分の乱数を使用して、同じハッシュ値を生成。
これにより、クライアントが送信したハッシュ値とサーバが生成したハッシュ値が一致することが確認される。

9. サーバ側は、PC側から受け取った「ハッシュ値」と、サーバ側で生成した「ハッシュ値」を比較
サーバは、クライアントから受信したハッシュ値と、自分で生成したハッシュ値を比較。
一致していれば、接続が認証され、クライアントはサーバに接続できる。


Nginxにssh接続しよう!

ここでは例として以下のようにします。
■ 公開鍵ファイル: practice-public1.pem
■ user名: ec2-user

以下のコマンドでSSH接続を行います。
【Linuxの場合のssh接続構文】

ssh -i <キーペアのパス> <ユーザー名>@<インスタンスのパブリックIPアドレス>

ので、今回の例の場合は、以下のようになる。

$ ssh -i ./practice-public1.pem ec2-user@13.115.133.207

接続に関する詳細はAWS公式ドキュメントを参照してください。

※もし接続できないとき

$chmod 400 ./practice-public1.pem
chmodコマンドについて
  • UNIXやLinuxなどのオペレーティングシステムにおいて、
    ファイルやディレクトリのパーミッション(アクセス権限)を変更するためのコマンド
  • chmodは、"change mode"の略語で、ファイルの読み書き実行権限を変更するために使用されます。

基本構文は以下の通り。

$chmod [オプション] モード ファイル名
  • オプション:chmodコマンドに付加的な機能を提供します。
  • モード:ファイルのアクセス権限を表します。数値または記号で指定できます。
  • ファイル名:アクセス権限を変更したいファイル名を指定します。

ex.

$chmod 755 sample.txt

この場合、"sample.txt"ファイルのパーミッションを、所有者に読み書き実行権限、グループユーザーに読み取り実行権限、その他のユーザーに読み取り実行権限を与える。

chmodコマンドでは、数値でパーミッションを指定することもできます。数値で指定する場合、4桁の数値を使用し、それぞれの桁がそれぞれのユーザーの権限を表します。

ex.

$chmod 777 sample.txt

この場合、"sample.txt"ファイルのパーミッションを、所有者、グループユーザー、その他のユーザーに
読み書き実行権限を与えます。

amazon-linux-extrasの確認

1. whichコマンドを使用して、amazon-linux-extrasパッケージがインストールされているかを確認。

$ which amazon-linux-extras
/usr/bin/amazon-linux-extras

※もしパッケージがインストールされていない場合は、以下のコマンドでインストールできます。

$ sudo yum install -y amazon-linux-extras

2. amazon-linux-extrasを使ってインストールできるパッケージの確認。

$ amazon-linux-extras
 0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  6  postgresql10             available    [ =10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
:
:
36  BCC                      available    [ =0.x  =stable ]
37  mono                     available    [ =5.x  =stable ]
38  nginx1                   available    [ =stable ]
40  mock                     available    [ =stable ]
41  postgresql11             available    [ =11  =stable ]
:
71  golang1.19               available    [ =stable ]

3. Nginxのインストール
以下のコマンドでNginxをインストール。

$ sudo amazon-linux-extras install nginx1

すると、以下のメッセージが表示されます。

:
Is this ok [y/d/N]:

ここで、以下のいずれかのアクションを選択できる。

  • y: 「yes」の略で、インストールが成功したことを確認し、プログラムを実行します。
  • d: 「diff」の略で、インストールされたファイルと既存のファイルを比較します。
  • N: 「no」の略で、インストールを中止します。
    NginXを使用するためには、yを選択する必要があるが、その前に、インストールが正しく行われているか
    確認するためにdをまず選択することが推奨されている

4. 最後は、インストールを確認しましょう!

$ nginx -v
nginx version: nginx/1.22.1

使えるコマンド

どのコマンドを使用していいか、わからないときのコマンド: nginx -h

$ nginx -h

これで以下のようにサポートしているコマンドが出力されます。

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/share/nginx/)
  -e filename   : set error log file (default: /var/log/nginx/error.log)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration file

nginxの設定を確認: nginx -t

出力

nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2023/04/08 10:15:17 [warn] 4607#4607: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:5
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2023/04/08 10:15:17 [emerg] 4607#4607: open() "/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed

Configuraition(設定)修正 (servername, userなど)

$ sudo vi /etc/nginx/nginx.conf

もしPermissionエラーが出るとき...

$ sudo nginx -t

//出力
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

設定を変更したら、Nginxの起動

$ sudo service nginx start

確認

sudo service nginx status

access logを見る

$ watch -n 3 -d cat /var/log/nginx/access.log

error logを見る

$ watch -n 3 -d cat /var/log/nginx/error.log 

以上!

Discussion