🔐

SSH・公開鍵認証について(🔰)

2023/07/05に公開

はじめに

スクールのカリキュラムの演習問題でつまづいたので、
公開鍵認証について理解してみようと色々調べてみました😇
間違いなどあればぜひ教えていただけますと幸いです!

SSH(Secure Shell)とは

SSHは、暗号技術を用いて他のコンピュータと通信するためのプロトコル(規約)の1つ。

SSHはネットワークを通じてコンピュータにログインしたり、
ファイルを転送したり、他のシステムでコマンドを実行したりする際に、
そのすべての通信が暗号化されることを保証します🙆🏻‍♀️

通信内容を盗聴されるリスクが大幅に軽減され、安全に通信できます!

SSHの接続認証には鍵認証パスワード認証がありますが、
基本的には情報漏洩のリスクがパスワードに比べて低い、鍵認証を使用します。

公開鍵認証の仕組み

公開鍵認証とは、公開鍵秘密鍵という2種類の鍵のペア(キーペア)を用いて認証を行う方式。
(鍵と言っているが、実際はただのファイル)
※公開鍵は公開しても良いが、秘密鍵は絶対に漏らしてはならない!パソコンに大切に保管しておく。

EC2サーバー側に鍵の差し込み口(公開鍵)があり、xxxxx.pemが鍵(秘密鍵)で、
合っていれば解錠(接続可能)できるというイメージ。

https://qiita.com/angel_p_57/items/19eda15576b3dceb7608#公開鍵認証のイメージ

簡単な流れとしては、

❶自分のパソコンで秘密鍵を使って、電子署名データを作成し、サーバーに送信

❷サーバーでは、その電子署名データを受け取って公開鍵を使って検証

❸検証に合格すれば、認証成功と判断しリモート接続を許可

公開鍵認証を使用した、EC2インスタンスへのSSH接続の流れ

1. キーペアの生成

新しいEC2インスタンスを作成する際、
AWSマネジメントコンソールから新しいキーペアを生成するか、既存のキーペアを選択します!

新しいキーペアを生成した場合、秘密鍵を含んでいる.pemファイルがダウンロードされます。
この秘密鍵を使用してインスタンスにSSH接続します!
(一方、公開鍵はAWSが保持しており、それを使用してEC2インスタンスの作成時に各インスタンスに自動的に登録します。)

ちなみに

キーペアのタイプとプライベートキーファイルの形式の違いは?

キーペアのタイプ

特徴
RSA ・ もっとも広く使用されている公開鍵暗号化方式で、安全性が高い。
・ 暗号化と復号化のプロセスは比較的計算量が多いため、パフォーマンスがやや劣る場合がある。
・ RSAキーペアの鍵長として2048ビットまたは4096ビットを選択できる。
ED25519 ・ EdDSAというデジタル署名アルゴリズムの一種。
・ 鍵長は固定の256ビット。
・ セキュリティレベルが高く、計算効率も良い。
・ OpenSSH 6.5以降など、比較的新しいシステムでしかサポートされていない。

プライベートキーファイル

特徴
PEM ・ Privacy Enhanced Mailの略。
・ メールのセキュリティ拡張を目的として開発された規格。
・ 現在では様々な証明書や鍵の形式で広く使用されている。
・ AWS EC2では、PEM形式のファイル(.pem)が秘密鍵としてダウンロードされる。
PPK ・ Putty Private Keyの略。
・ PuTTYというSSHクライアント専用の秘密鍵形式。
・ Windowsでは、PuTTYを使ってSSH接続するためには、PuTTYgenというツールを使いPEM形式の秘密鍵をPPK形式に変換する必要がある。

2. 公開鍵の配置

AWS側で自動的に行われます。
新しいEC2インスタンスを起動する際、選択した公開鍵がEC2インスタンスに配置されます。👀

3. 認証

3-1. 作成したキーペア(秘密鍵)をCloud9上にドラッグ&ドロップ

Cloud9の中で/home/ec2-user/environmentにいることを確認し
下記コマンドで、.sshというフォルダへキーペア(秘密鍵)を移動!

username:~/environment $ mv xxxxx(your-key).pem ~/.ssh/

3-2. キーペアファイルの権限を変更する

ファイルの所有者に対して「読み書き権限を与え、他のユーザーには権限を与えない」設定を行います。
権限を変更しないでsshログインしようとすると、エラーが発生します!

  • 「chmod」は、権限を変更するコマンド
chmod コマンド

chmod コマンドでは、各パーミッションは3桁の数値で表現されます。

それぞれの桁は、所有者(owner)、グループ(group)、その他のユーザー(others)を表します。

それぞれの桁には以下の数値が割り当てられています!

  • 4: 読み取り権限(Read)
  • 2: 書き込み権限(Write)
  • 1: 実行権限(Execute)

これらの数値を足し合わせることで、複数の権限を同時に設定することが可能です。

したがって、chmod 600というコマンドは以下のようなパーミッション設定を意味します!

  • ファイルの所有者には読み取り(4)と書き込み(2)の権限を付与(4+2=6)
  • ファイルの所有グループにはすべてのアクション(読み取り、書き込み、実行)が禁止(0)
  • その他のユーザーに対してもすべてのアクション(読み取り、書き込み、実行)が禁止(0)
  • 「sudo」は、管理者権限でコマンドを実行するコマンド
username:~/environment $ sudo chmod 600 ~/.ssh/xxxxx(your-key).pem

3-3. 秘密鍵を使用してEC2インスタンスにSSHで接続

  • キーペア、アクセス先サーバーのユーザ名、パブリックIPアドレスを指定
  • EC2では、初期設定のユーザ名は必ず「ec2-user」
  • @の左側に「ec2-user」、右側にパブリックIPアドレスを指定
接続のコマンド
ssh -i xxxxx(your-key).pem username@xx.xx.xx.xx(ec2-instance-public-ip)

下記のメッセージは、SSH接続のようにセキュリティの高い接続をする際のコマンドで、
初めてアクセスするサーバーで表示されます。
「yes」で進めてください。

The authenticity of host 'xx.xx.xx.xx (xx.xx.xx.xx)' can't be established.
ECDSA key fingerprint is SHA256:+MxOlUCf7HpfqkE4syIBDBSr0xt6Mq8sl/sS27TT1Mk.
Are you sure you want to continue connecting (yes/no)?

サーバーへログインできると、以下のように表示されます!
(数字の部分は環境によって異なります)


       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/

公開鍵はどこにある??

キーペアは公開鍵と秘密鍵のセットの総称のこと。

キーペアを選択してEC2を作成した時点で公開鍵が
~/.ssh/authorized_key内に勝手に配置されているらしい。

確認方法

[ec2-user@ip-192-168-96-243 ~]$ cd ~/.ssh
[ec2-user@ip-192-168-96-243 .ssh]$ ls
authorized_keys
[ec2-user@ip-192-168-96-243 ~]$ cat authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGAHeBk4DtrTChntTfT2dimzz8bopuvN0NAMKeaDRgxG Batch

上記コマンドで、authorized_keysに秘密鍵とペアとなる公開鍵が登録されていることがわかる。

https://qiita.com/aiandrox/items/98ad9b7551481d890916#公開鍵の場所

メモ

公開鍵と秘密鍵の内容は別物?

公開鍵と秘密鍵はペアとして動作しますが、その内容自体は異なります。
互いに異なるデータであり、公開鍵から秘密鍵を逆算することは不可能です。

秘密鍵を使用することで、データの暗号化やデジタル署名の生成などが可能になり、
公開鍵は暗号化されたデータの復号化や、デジタル署名の検証に使われます。

また、ハッシュ化(元のデータから固定長の一意の値(ハッシュ値)を計算する)
というプロセスは秘密鍵を公開鍵と一緒にするものではありません。
ハッシュ値は一意であり、元の秘密鍵がわかるわけではなく、公開鍵とも関連付けられません。

ハッシュとは

.sshファイルgitignoreに記載した方がいいの?

通常、.ssh ディレクトリはユーザーのホームディレクトリにあり、
記載しなくても普通は上がらない。
プロジェクト内に .ssh ディレクトリやその内容が存在しないように注意!

公開鍵を他の人に渡す状況って?

公開鍵から秘密鍵の復元は不可能なので、公開鍵は誰に渡しても大丈夫

状況としては、、

他の人が作ったEC2インスタンスにログインしたい!
秘密鍵は公開してはいけないので、その人の秘密鍵はもらえない、、!
となったする。
⬇︎
自分のEC2インスタンスの公開鍵を相手の.ssh/配下に置いてもらう。
そうすることで、自分の秘密鍵で相手のEC2インスタンスにログインできるようになる!!
(自分は鍵穴を渡し、相手の鍵穴が増えるイメージ。開けるのは自分の鍵。)

scpコマンド

踏み台サーバーに鍵を送る時に使ったこのコマンド。
(踏み台サーバーにバッチサーバーの秘密鍵を置いているイメージ?)

scp -i ~/.ssh/xxxxx(踏み台サーバーの秘密鍵).pem ~/.ssh/xxxxx(バッチサーバーの秘密鍵).pem ec2-user@xx.xxx.xxx:.ssh

この scp コマンドは、SSHを使用してローカルシステムとリモートシステム間で
ファイルをコピーするためのコマンド。

-i ~/.ssh/xxxxx.pem
このオプションは、SSH接続の認証に使用する秘密鍵ファイルを指定します。

~/.ssh/xxxxx.pem
これはコピー元のファイルのパス。

ec2-user@xx.xxx.xxx:.ssh
これはコピー先のパス。
ここでは、ec2-userというユーザー名で、IPアドレス xx.xxx.xxx のリモートマシンの .ssh ディレクトリにコピーします。

「xxxxx(踏み台サーバーの秘密鍵).pemを使用して、Cloud9 環境にある Batch.pem ファイルをEC2インスタンスの .ssh ディレクトリにコピーする」という意味になります。

書いていて思ったが、ここって秘密鍵を渡していていいものなのか。。?
(後で誰かに聞いておきます🤔)

この件、聞いてみたら、所有者は同じなので大丈夫との回答が!
自分の家の鍵を自分の家の中で使う分には問題ないですよね。
同一システム内なので大丈夫。こういうケースは実際多いらしい。
第3者に渡してはいけないという認識で良いとのこと。

さいごに

もっと理解したかったけどキリがないので今日はここまで😂
少しはイメージがつかめたかなと思う!

参考にさせていただいた記事🌱

https://zenn.dev/luvmini511/articles/0e471affdcba52

https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432

https://www.youtube.com/watch?v=uURs8HnzCQU&t=4s&ab_channel=徳田啓【プログラミング学習チャンネル】

Discussion