読者です 読者をやめる 読者になる 読者になる

nigoblog

スタートアップのCMOブログ

SSHの仕組み!ぼんやりとした理解だったものをすっきりさせようの会

技術 tips コマンド

特にシリーズ化を目論むわけではないですが、
完全に理解しているわけではないけど、使える。
みたいなものってありますよね。

そういうのはよくないのでしっかりと理解しよう!
というテーマでやります。

今回はSSHの仕組みについて書いていこうと思います。

  1. 参考記事
  2. 概要 ~SSHとは~
  3. SSHの仕組みを理解するための用語
  4. 鍵交換方式の仕組みと実際のコマンド
  5. 便利なオプション
  6. まとめ

このような流れで書いていきます。



参考記事

こちらを参考にします。(ぶっちゃけこれだけ見ればオッケーな気も。。。)
公開鍵暗号について理解が足りていなかったのでメモ - かせいさんとこ
鍵交換方式による認証

概要 ~SSHとは~

SSHはSecure Shellの略で、あるマシンに別のマシンからアクセス , ログインするというイメージです。
主にサーバー(リモート)にクライアント(ローカル)からアクセスするときに使います。
サーバーというときはクライアントといい、
リモートというときはローカルというイメージ。
たぶん厳密には違うのだろうけど。

SSHの仕組みを理解するための用語

  • サーバー - クライアント(リモート - ローカル)
  • 鍵交換方式
  • 秘密鍵 - 公開鍵
  • ハッシュ値
  • 乱数生成
  • RSA (暗号化方式)

上記の用語が現れます。
鍵交換方式で説明するので今はこういうのがあるのだなという理解でオッケーです。

鍵交換方式の仕組みと実際のコマンド

具体的にSSHでサーバーにアクセスするためにsshコマンドをした後、どのような処理が行われているかを見ていきます。また、そのときどういうコマンドを使うかについても書きます。
まずは以下の図を見てください。
f:id:nigohiroki:20130818124121p:plain
左側がクライアント、右側がサーバーです。
今回はこの図にそって説明します。

準備編

クライアント側で秘密鍵、公開鍵を生成する

まずは鍵を作成します。鍵には秘密鍵と公開鍵があり、大抵同時に生成します。

> ssh-keygen -t rsa -T [ファイル名]

このコマンドで生成します。-t で暗号化方式を指定この場合rsaを利用。

  • T でファイル名を指定します。

このコマンドを実行するとパスフレーズの入力が求められるので入力して進めます。
最終的に [ファイル名], [ファイル名].pub
という二つのファイルができます。

公開鍵をサーバに渡す

生成した鍵のうち、公開鍵をサーバーに配置します

> scp [ファイル名].pub [ホスト名]:/home/[ディレクトリ名]

AWSの場合あらかじめpemでsshができるようになっているので

> scp -i xxx.pem ~/.ssh/[ファイル名].pub ec2-user@[ホスト名]:/home/ec2-user/

というようにするのが一般的です。

サーバー側で公開鍵とユーザーを結びつける

サーバーでユーザーを作り、そのユーザーの鍵として先ほどの公開鍵を利用します。
以下はサーバー側のコマンドです。
まずユーザの作成

> adduser [ユーザー名]
> passwd [ユーザー名]

とするとパスワードの入力をします。
ユーザー作成後

> vi /etc/sudoers
[ユーザー名] ALL=(ALL)     ALL

とすることで作成したユーザーにsudo権限を与えます。
そこで先ほどサーバー側に渡した鍵をユーザー配下におきます。

> cd /home/[ユーザー名]
> mkdir .ssh
> mv /home/ec2-user/[ファイル名].pub /home/[ユーザー名]/.ssh/authorized_keys

最後にオーナーグループ、パーミッションの変更をします。

> chown [ユーザー名] /home/[ユーザー名]/.ssh/authorized_keys
> chgrp [ユーザー名] /home/[ユーザー名]/.ssh/authorized_keys
> chmod 600 /home/[ユーザー名]/.ssh/authorized_keys
> chmod 700 /home/[ユーザー名]/.ssh

この段階で準備は完了。次にsshコマンドをした時にどうなるかを説明します

SSHコマンド

1. ユーザー名とホスト名を指定し、SSHコマンドを叩く

> ssh [ユーザー名]@[ホスト名]

2. サーバー側で乱数を発生し、公開鍵とその乱数で暗号を作成。作成した暗号をクライアント側に渡す。
3. 暗号生成と同時に、乱数を利用しハッシュ値を生成する。(サーバー側)
4. クライアント側で暗号を受け取ると、パスフレーズ秘密鍵を複合化。それと暗号を複合し、サー5. バー側で生成した乱数を発生させる。
5. 発生した乱数からサーバー側で生成したハッシュ値を生成し、known_hostsに保存。
6. クライアント側で生成したハッシュ値をサーバー側へ送る
7. クライアントから送られてきたハッシュ値とサーバー側で持っているハッシュ値が一致したら認証成功。

このような流れでログインが完了します。

sshコンフィグ

~/.ssh/config
を編集するといろいろ便利になります。
ひな形として次のように書きます

Host [ユーザー名等]
  HostName [ホスト名]
  User [ユーザー名]
  IdentityFile ~/.ssh/[秘密鍵ファイル名]

このようにすると

> ssh [ユーザー名等]

とするだけでホスト名を覚えなくてもすぐにsshログインができるようになります。

まとめ

長くなりましたがSSHの仕組みに関してでした。
今後いろいろ理解してない部分はしっかり理解しようと思います。

その他、SSH以外にもproxyやSSLなどなど仕組みが曖昧な技術が色々あるので、
仕組みを理解するたび、今回のSSHの仕組みのようにじっくり解説出来る記事を上げられたらなと。