背景
なんとなく、id_rsaとか生成して、サーバに接続したり、xxx.pemを使ってAWS EC2に接続したりしているけど、理解があいまいだったので、整理。
要は秘密鍵ファイルと公開鍵ファイルを使って、通信を暗号化することにより、リモートアクセス、リモートコピーをセキュアに可能にする。
ということくらいは前々から分かっているのだが、通信の暗号化だけでなく、認証が不要になるのが、ちょっと理解不足。
ここに具体的に書かれていた。
http://ossfan.net/setup/openssh-02.html
なるほど、sshサーバ側で秘密鍵だけで認証可にする設定があると。
秘密鍵ファイル
ローカル、サーバ接続の場合
ローカルPCで作成するid_rsa、id_dsaとか。
id_rsa、id_dsaは暗号化方式の違い。RSAかDSAか。
背景に記載したように、認証無しでサーバに接続できることも可能なので、変なサーバに置いたり、コピーしたりしてはダメ。
AWS接続の場合
AWS CONSOLEでダウンロードするxxx.pem。
catで中身を見たら、id_rsaもxxx.pemも中身は-----BEGIN RSA PRIVATE KEY-----から始まる文字列なので、一緒。
pemを使ってアクセスする際は、pemのパーミッションを適切に設定しないと、下記のようなエラーが出て、接続できない。chmod 400 xxx.pemのように変更する必要がある。
Permissions 0644 for 'xxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "xxx.pem": bad permissions
Permission denied (publickey).
公開鍵ファイル
ローカル、サーバ接続の場合
ローカルで秘密鍵の作成と同時に作成される。サーバに置く。
id_rsa.pubみたいな公開鍵ファイルをそのまま置くのではなく、~/.ssh/authorized_keysに追記する形でサーバに置く。
AWS接続の場合
初期状態で~/.ssh/authorized_keysに公開鍵の情報が記載されている。
そのため、xxx.pemがあれば、サーバにID、PASS認証無しで接続可能。
接続
よく
ssh hogeserver
のようにサーバへ接続するのだけど、暗黙的に~/.ssh/id_rsaを使用している。
そのため、AWS EC2に接続する場合は、明示的にpemファイルを指定しないといけない。
それが、
ssh -i hoge.pem ec2-user@ec2-XX-XXX-XX-XX.ap-northeast-1.compute.amazonaws.com
の-i指定。
ただ、毎回、そのオプションを入力するのは面倒なので、~/.ssh/configに下記のように記載すると、
Host ec2-XX-XXX-XX-XX.ap-northeast-1.compute.amazonaws.com
HostName ec2-XX-XXX-XX-XX.ap-northeast-1.compute.amazonaws.com
Port 22
User ec2-user
IdentityFile ~/.ssh/hoge.pem
ssh ec2-user@ec2-XX-XXX-XX-XX.ap-northeast-1.compute.amazonaws.com
でサーバに接続できるようになる。
scpは秘密鍵、公開鍵の扱い的にはsshと変わらないということで・・・
herokuへのアクセス
herokuにheroku CLIで接続する際、秘密鍵、公開鍵を使用して、接続する。
ssh-keygen -t rsa
heroku keys:add
のように、ローカルで秘密鍵、公開鍵を生成して、コマンドで追加できる。
管理画面からid_rsa.pubの内容を登録してもよい。
これにより、heroku CLIでheroku loginから通信を暗号化して、herokuにアクセスできることになる。
なるほどなーと。
github、gitlab、bitbucuketからのサーバへのデプロイ
ソースコードがgithub、gitlab、bitbucuketにあって、herokuではない一般的なサーバにそのソースコードをデプロイしたい。かつ、自分だけではなく、数人がデプロイすることがある。
あと、gitのレポジトリはhttpsではなく、sshでアクセスする。
そんな場合に、サーバにデプロイ担当者がユーザを作って、/home/user/.ssh/に秘密鍵を置くのも面倒だし、セキュリティ的に危険。
その解決方法として、github、gitlab、bitbucketにレポジトリごとにデプロイ鍵(Deploy Keys)という設定がある。
このデプロイ鍵にサーバでデプロイ用ユーザで認証なしで作成した公開鍵を登録すると、
デプロイ用ユーザにsuして、git pullするだけで、複数人がデプロイが可能になる。
レポジトリのメンバーにデプロイ用ユーザを追加して、デプロイ用ユーザの公開鍵に登録する方法もあるが、
上記の方が管理がシンプルになり、わかりやすい。