文系エンジニアの備忘録

文系ですがエンジニアです。

SSHの使い方いろいろ

SSH便利ですよね。
自宅のサーバや1階でノートPC触ってる時に2階のマックのファイルが必要になった時とかAWSなんかでも使いますよね。
私も使ってます。

これまでそんな大したものも無いしと思って自宅のサーバはパスワード認証だったのですが、AWSではデフォルトで公開鍵認証なので勉強してみました。

SSHとは

SSHとはSecure Shellの略です。
従来利用されてきたTelentなどの方法の弱点を克服するために開発されたプロトコルであり、その安全性には非常に重きが置かれています。
SSHの暗号通信は公開鍵暗号を用いて通信用の共通鍵を暗号化し鍵交換を行ったあと通信自体は高速な共通鍵暗号方式で行うハイブリッド仕様です。
バージョン1とバージョン2の2つのプロトコルがあるが、バージョン1には脆弱性が発見されているため現在ではバージョン1の使用は推奨されていません。

Secure Shell(セキュアシェル、SSH)は、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。パスワードなどの認証部分を含むすべてのネットワーク上の通信が暗号化される。
from Wikipedia

らしいです。

OpenSSH

LinuxSSHを利用する場合はOpenSSHというソフトがデファクトスタンダードとなっておりほぼすべてのディストリビューションでプリインストールされています。

OpenSSHのコマンド

ssh -- sshでホストに接続しコマンドを実行できます。ホストはローカル、リモートを問いません。
ssh-keygen -- ssh接続用のキーペアを生成します。

--使用例--
$ ssh hoge@hoge.com
この時ユーザ名を指定しないと現在のユーザ名で接続します。
また-lをプションでユーザ名をしていすることもできます。
$ ssh -l hoge hoge.com

認証の方法

OpenSSHではSSHの安全性を保つために数種類の認証方式が用意されている。
主なのは次の2つ

  • パスワード認証
  • 公開鍵認証
パスワード認証

文字通りパスワードを用いて認証する方式です。使い方はTelentなどと同様で上記コマンドで接続後パスワードを聞かれますので入力し認証後接続完了です。
この方法ではアカウント名とパスワードさえ知っていれば誰でも接続することができるので簡単である反面、暗号化されているとはいえパスワードがネットワーク上に流れますし、メリットを裏返すとパスワードが漏れると誰でも接続できてしまうということです。

公開鍵認証

これはローカル上で予めキーペアを生成し、公開鍵を安全な方法でサーバへ届ける必要があります。何かしら物理メディアを使うことが安全ですが、他にもsftpなどセキュアな方法で転送する必要があります。しかし、一度設定してしまうとパスワードや鍵がネットワーク上を流れることはありませんので非常に安全性が高いといえます。

また、OpenSSHでは明示的に設定しないかぎりパスワード認証を許可しています。

キーペアの生成方法

キーペアの生成にはSSHの「ssh-keygen」コマンドを使います。
まず、ローカルで以下を実行

$ ssh-keygen -t rsa

-tオプションで下記のタイプを指定しています。ここでは標準的なRSA鍵を生成します。
上記コマンドを実行すると対話式のキーペア生成モードに入ります。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa): ←※1
Enter passphrase (empty for no passphrase): ←※2
Enter same passphrase again: ←※3
Your identification has been saved in /home/hoge/.ssh/id_rsa.
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.
The key fingerprint is:
35:96:22:65:90:7e:39:82:01:2e:19:57:5a:bb:32:37 hoge@fuga.com
The key's randomart image is:
+--[ RSA 2048]----+
|. ooo .oo        |
| = o...o   .     |
|o o .+. ..=      |
| .  ..o.++ .     |
|  o E  oS.       |
|   + .           |
|                 |
|                 |
|                 |
+-----------------+
  • ※1→キーペアを保存する場所を聞いています。そのままEnterで~/.ssh/に保存します
  • ※2→パスコードを指定できます。ここでパスコードを設定すると接続のたびにパスコードが必要になります。そのままEnterでパスコード無しで鍵を生成できます。
  • ※3→パスコードを確認のため再度聞いています。

以上でキーペアが~/.ssh/もしくは※1で指定した場所に生成されています。

$ ls
authorized_keys  id_rsa  id_rsa.pub

となっているはずです。authorized_keysはない場合もあります。また、他に幾つかファイルがある場合がありますが、ここではキーペアである

があるかを確認します。id_rsa.pubのpubはpublicの略でこちらが公開鍵になります。

公開鍵の設置

id_rsa.pubを接続したいサーバの使用するユーザのカレントディレクトリ/.ssh/へ転送します。
※id_rsa.pubを転送したあとは不要ですので紛らわしくならないようにローカルでは削除して構いません。

その後接続したいサーバで以下を実行

$ cd ~/.ssh/
$ cat id_rsa.pub >> authorized_keys
$ rm id_rsa.pub

これは既にauthorized_keysが存在している場合です。
authorized_keysとはリモートサーバにおける鍵束(キーチェーン)です。
今後は公開鍵が増えた場合はこのファイルへどんどん追記していく形です。

authorized_keysがまだ無い場合は今転送したid_rsa.pubをそのままauthorized_keysにしてしまいましょう。

$ mv id_rsa.pub authorized_keys
$ chmod 600 authorized_keys

この時必ず安全のためauthorized_keysの権限を600へ変更してください。
既にファイルが有った場合も一度確認してみましょう。

秘密鍵の設定

秘密鍵はローカルのどこにおいていても構いませんが、管理などを考えると~/.ssh/へ置いておくのがベターだと思います。
こちらも先ほどと同様に

$ chmod 600 id_rsa

権限を600へ変更しておきましょう。
秘密鍵は権限がOpen過ぎるとOpenSSHで弾かれて接続できなくてエラーが出ます。
必ず変更してください。

接続テスト

これで接続が可能なはずなので

$ ssh -i ~/.ssh/id_rsa hoge@fuga.com

で接続可能か確認してください。
またid_rsaは今後またキーペアを生成するときにこのままでは上書きされてしまいますので任意の名前に変更するといいと思います。

鍵の形式について

SSHの鍵にはいくつか種類がありssh-keygenで生成される鍵はおおむねRFC4716の形式と同じだが、ヘッダは含まず改行もされていない。OpenSSH独自の形式らしい。
よく使用される形式にヘッダつきのPEM形式を使うことが多いと思います。
特にFTPソフトなどでSFTPで接続するときなんかは対応していないことが多いと思います。
こちらもOpenSSHで使用可能であり、また変換も可能なので方法を載せて置きます。
私は汎用性とかを考えてすべてpem形式で管理しています。

変換は以下のコマンドですることができます。

openssl rsa -in id_rsa -outform pem >id_rsa.pem

最後の部分で任意の名前.penで出力可能です。

※OpenSSLがインストールされていない場合はコマンドが実行できません。インストールしてください。

参考にさせていただいたサイト様やブログ様
ssh公開鍵認証を実装する - Qiita
Linuxコマンド【 ssh-keygen 】認証用の鍵を生成 - Linux入門 - Webkaru
Macでssh-keygenで作成した秘密鍵をPEM形式に変換する方法 | ゆるメモ

ありがとうございましたm(__)m