SSHの基礎知識
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を使用してローカルネットワーク内のサービスを外部からアクセス可能にするための仕組み。
ネットワーク内のあるサーバーに対して、外部のユーザーが直接アクセスできない場合に、
別のサーバーを経由してアクセス可能にするための仕組みです。
-
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