Photoruction工事中!

Photoructionの開発ブログです!

【初学者向け】はじめての公開鍵認証を用いたSSH接続

0. はじめに

フォトラクションでWEBエンジニアを担当している桑畑です。

初学者の方向けに、公開鍵認証を利用したSSH接続について記述していきます。既に理解されてる方には、新しい知見は無いかと思います。

こちらのテーマ選定をした背景は、私自身が曖昧な理解で何とな〜く利用していたため、、、理解向上のために調べたことや、AWSのEC2を利用して実験したことを記事にしております。SSH接続や公開鍵認証に対して少しでもイメージが掴んで頂ける情報になっていれば嬉しいです。

理解が間違っている箇所、説明に不備がある点などがあればご指摘頂けたらと思います。

1. SSH

1-1. SSHとは

SSHとは、リモートのサーバー・PCに対してセキュアに遠隔操作を可能にする通信プロトコルです。「サーバー → サーバー」や「ローカルPC → サーバー」などといった遠隔にあるサーバーに対して、SSH接続を用いることで安全にアクセスし、操作することが可能となります。

1-2. SSHの利用用途

SSH接続の利用用途は様々あるかと思います。

私がよく利用する機会は、ローカルPCからAWS-EC2インスタンスに対して接続する際に用います。SSH接続をしてEC2インスタンスのサーバー内を操作したり、scpコマンドでファイル転送をしたりしています。

1-3. SSHサーバー、SSHクライアント

SSH接続する側とSSH接続される側で、呼称が異なります。SSH接続をリクエストする側をSSHクライアントと言います。逆に、リクエストされる側をSSHサーバーと言います。ローカルPCからAWS-EC2インスタンスに対して接続する際には、ローカルPCがSSHクライアントであり、EC2インスタンスSSHサーバーです。

2. 公開鍵認証

2-1. 公開鍵認証とは

公開鍵認証とは、鍵(key)を利用して、通信の内容を秘匿にする仕組み・方法のことを指します。公開鍵認証でも幾つか手法があるようですが、一般的に用いられるのは鍵(key)は、公開鍵と秘密鍵の2種類のペアを用いることによって外部からの盗聴を防ぐ仕組みです。

2-2. 秘密鍵と公開鍵

秘密鍵と公開鍵とは何でしょうか。2つの鍵を理解するための概念として、情報を秘匿にして通信をするために『暗号化』と『復号化』という処理が存在します。文字通りではありますが、暗号化は、情報を外部から読み解け無い情報に変換します。 復号化は、暗号化された情報を複号して読み解ける状態にします。2種類の鍵を利用して外部から盗聴されることを防ぎます。

image_01

公開鍵 平文(暗号化されていない情報)を暗号化する際に用います。公開鍵は秘密鍵を利用して作成されます。通信対象であれば、公開鍵を複数人でも持つことが可能です。極端な話、公開鍵はばら撒いても問題にはなりません。 秘密鍵 暗号化された情報を平文へ複号する際に用います。秘密鍵は他人に公開するのはNGです。 暗号化の方式は複数存在するようです。「RSA」「DSA」「ECDSA」など、色々な方法があるようです。

3. 公開鍵認証を用いたSSH接続の実験 ~ 秘密鍵を発行していないサーバーへSSH接続 ~

最後に、EC2インスタンスで公開鍵認証を用いたSSH接続を試みます。

理解を深めるために、EC2インスタンスが発行していない秘密鍵を利用してSSH接続をします。

EC2-01、EC2-02という2つのインスタンスを用意し、それぞれのインスタンスから別々のキーペアを作成します。(別の秘密鍵をダウンロードします。)最終的には、EC2-01の秘密鍵を用いて、EC2-02にSSH接続をしてみます。※添付画像参照

3-1. EC2インスタンスが発行した秘密鍵を用いてSSH接続

まず、それぞれのEC2にSSH接続が可能かを確認します。 EC2-01が発行した秘密鍵-01を利用してSSH接続 (コマンドの解説は省略)

// コマンド例
ssh -i ~/.ssh/ec2_01.pem ec2-user@{EC2-01のIP}

次に、EC2-02が発行した秘密鍵-02を利用すれば、EC2-02へSSH接続は可能です。

// コマンド例
ssh -i ~/.ssh/ec2_02.pem ec2-user@{EC2-02のIP}

3-2. 他のEC2インスタンスが発行した秘密鍵を用いてSSH接続 (失敗を確認)

最終的に実行したいコマンドを試しに実行します。EC2-01が発行した秘密鍵-01を利用して、EC2-02へSSH接続

// コマンド例
ssh -i ~/.ssh/ec2_01.pem ec2-user@{EC2-02のIP}

現時点では、EC2-01が発行した秘密鍵-01を利用して、EC2-02へSSH接続すると接続不可となってしまいます。失敗を確認できました。

3-3. 他のEC2インスタンスが発行した秘密鍵を用いてSSH接続を成功させる

公開鍵認証を正しく実行するためには、秘密鍵-01が発行した公開鍵-01がSSHサーバー側に存在する必要があります。この仕組みを利用して、EC2-01の公開鍵01をEC2-02へ配置します。

公開鍵のファイルは、SSHサーバーの~/.ssh/authorized_keys に存在します。今回のSSH接続でいうと、EC2インスタンス~/.ssh/authorized_keys のファイルに記述されています。

下記のような文字列です。

// EC2−01インスタンス  ~/.ssh/authorized_keysファイル内
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCERdTPh2CG81cdU67g0sSxc8ghvbGH4Agjk63BsaPh+07X0u+xcXL5WwXxkcqdmacU7FCij+HOyrkzflEpjzILs4QHzcayQAUuHqIsB80X/IB416qyRNau3pBfwUrB3oeRY47rq3moeY6jiXKOoZt1qPhe4Jr3f+cd5qbtpCvkMc3XnPuJEtlqrvLxWWR2N3KCfXdSiV6SRPtTSrQaouybayWKXKOqXoXGKtn6gvdhwQYD+4dImYL0CDEWIlIyB6JS5XhtSwh8hScr77BdAp2lqECearIh+9xI1hx0pe5CDmnV9hI0ASUJSGtlXPM EC2-01

EC-01の公開鍵を、EC2-02の~/.ssh/authorized_keys に追加します。

// EC2−02インスタンス  ~/.ssh/authorized_keysファイル内
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCERdTPh2CG81cdU67g0sSxc8ghvbGH4Agjk63BsaPh+07X0u+xcXL5WwXxkcqdmacU7FCij+HOyrkzflEpjzILs4QHzcayQAUuHqIsB80X/IB416qyRNau3pBfwUrB3oeRY47rq3moeY6jiXKOoZt1qPhe4Jr3f+cd5qbtpCvkMc3XnPuJEtlqrvLxWWR2N3KCfXdSiV6SRPtTSrQaouybayWKXKOqXoXGKtn6htSwh8hScr77BdAp2lqECearIh+9xI1hx0pe5CDmnV9hI0A EC2-01
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4gm2J7iXdRpHaIuLFenSNyC+Qc72ZJeNwsg8QKsrvFuo4tWiHWLH3hS199gKFq4QXlf8aaC3c3n6MD6i6hBm1xkHjfM1suSAQX7vL6QyW75G/D+uC/cQf8RRM/fClELMtY/CQqGqyaaFjHt1tMqJYOvzi3jl9jBGQ87PVEyiRnHdOX9jmyKTAW86FyRlhFY708ZTySry9c8DiPVbuNTllWVX+GoHDwI/heINoL97q7VlYCuYPHPE6+BIYxWqrAUwGqj/8IvcuLr8q1ZAaKh8 EC2-02

3-2. 他のEC2インスタンスが発行した秘密鍵を用いてSSH接続 (失敗を確認)で失敗したコマンドを再度実行します。

// コマンド例
ssh -i ~/.ssh/ec2_01.pem ec2-user@{EC2-02のIP}

これで、EC2-01が発行した秘密鍵を用いて、EC2-02へと公開鍵認証を利用したSSH接続が確認できました。

4. おわりに

如何でしょうか。説明を省略した部分や、理解の浅い部分もあったかと思いますが、SSH接続や公開鍵認証について少しでもイメージを湧いて頂けたのであれば嬉しく思います。