SSHはコマンドラインで遠隔地のコンピュータを操作する方法です。
サーバーの操作は基本的にはSSHを使ってサーバにログインして操作します。
SSHの知識やスキルはサーバエンジニアとして必須の基礎知識です。
ここではSSHを利用するための設定方法や操作方法などについて紹介します。
目次
SSHとは?
SSHとはSecure SHellの略で、インターネットからサーバーをコマンドラインで操作する方法のことです。
サーバーは普通のコンピュータとは違ってシェルと呼ばれる黒い画面で操作します
似たような方法にtelnetがありますがSSHには認証機能があるのでより安全で、telnetはリモートサーバの操作のためにはほとんど利用されていません。
linuxでSSHを利用する場合、すでにインストールされているので特に操作は不要です。もし入っていない場合はSSH関連のパッケージのインストールが必要があります。
Ubuntuの場合は入っていない場合があるのでインストールしましょう。
サーバー機能を使う場合(ログインされる側)
Ubuntu
# apt-get install openssh-server
CentOS
# yum install openssh-server
クライアント機能を使う場合(ログインする側:操作側)
Ubuntu
# apt-get install openssh-clients
CentOS
# yum install openssh-clients
SSHクライアント機能を利用する
SSHを使ってSSHサーバーにアクセスする方法を解説します。簡単な使い方については下の記事でも解説していますが、改めて書いていきます。
1.SSHサーバーが起動したホストのIPアドレスを入力して接続します。
ssh リモートホストのユーザー名@サーバーのIPアドレス 例:ssh host@192.168.0.1 or ssh 192.168.0.1
始めての接続の場合はホスト鍵がまだ登録されていないので確認の表示がでます。ホストキーの確認は「~/.ssh/known_hosts」を参照すればわかります。
ローカルホストとリモートホスト
ローカルホストとは自分のパソコンで別のコンピュータに接続しようとした際に「自分側のコンピュータ」のことをローカルホストといいます。接続先のコンピュータは「リモートホスト」といいます。SSH接続でいえば、自分のコンピューターでSSHサーバーに接続するときはサーバー側がリモートホストです。
2.接続を終了するときは「exit」で終了する
SSHサーバー機能を利用する
SSHを使って接続される側はSSHサーバー(sshd)を起動しなければなりません。
ホスト機はSSHサーバーをインストールしておきましょう。
1. SSHサーバーの起動、停止、再起動、自動起動の有効化、自動起動の無効化、状態確認
・sshdの起動
systemctl start sshd
・sshdの停止
systemctl stop sshd
systemctl restart sshd
systemctl enable sshd
systemctl disable sshd
systemctl status sshd
Apacheなどの他のデーモンと同様にSSHもsystemctlで制御します。設定を変更したときは再起動しないと反映されないので注意しましょう。
sshサーバの設定
sshd_configの設定
SSHサーバーの設定はsshd_configを編集して変更します。
/etc/ssh/sshd_config
sshd_configでは以下のディレクティブがあります。
- Port:ポート番号(22)
- AuthorizedKeyFile:公開鍵の置き場(.ssh/authorized_keys)
- LoginGraceTime:自動切断時間
- PasswordAuthentication:パスワード認証 (def. yes)
- PermitRootLogin:rootログインの可否
- PubkeyAuthentication:公開鍵認証設定
- RSAAuthentication : RSA認証の可否
sshd_configの構文チェック
sshd_configの構文に誤りがないかをsshd -tのコマンドでチェックできます。設定を変更した後は構文のチェックをしましょう。
sshd -t
構文チェック後はsshdを再起動します。
systemctl restart sshd
SSHのセキュリティ設定
SSHではクライアントはサーバー側のユーザとしてログインしてコンピュータを操作することが可能になるため、しっかりとセキュリティ対策が必要です。SSHでは安全なクライアントーホスト間通信を実現するための対策がいくつもあります。
- 通信の暗号化
- ホストの認証(クライアント視点でサーバーを認証する)
- ユーザー認証(サーバーへのクライアントの認証)
があります。先立って必要なのは通信の暗号化です。
通信の暗号化
通信データを暗号化せずにそのまま(平文)送信すると第三者に盗聴されると情報が漏洩してしまいます。そのため、通信内容は暗号化したほうが良いです。通信経路の暗号化は後述するユーザー認証よりも前に行われるものです。
SSHではSSH1とSSH2の二種類の方式があります。SSH2のほうがより安全であるためSSH1は原則利用しないです。今回はSSH1とSSH2の通信経路の暗号化の解説のため両方とも説明します。
SSH1の暗号化
SSH1では「共通鍵暗号方式」を使って通信を暗号化します。その際に利用するのがサーバーが発行する「サーバーキー」です。サーバーキーは公開鍵と秘密鍵のペアからなる鍵で公開鍵は暗号化のみ、秘密鍵は復号化を行うのに利用します。公開鍵からは秘密鍵を作り出すことはできません。そのため公開鍵が第三者に奪われても安全な仕組みになっています。
下の図のようにSSHクライアントからSSHサーバーに接続されるとサーバーは発行したサーバーキーの公開鍵をクライアントに送ります。クライアントはサーバーから公開鍵を受け取ると暗号化と復号化どちらもできる共通鍵(茶色)を発行してこれを公開鍵で暗号化してサーバーに送ります。するとサーバーは秘密鍵で復号化して共通鍵を入手します。これでクライアント、サーバーが同じ共通鍵を共有することができました(鍵交換)。
この共通鍵を使って今後やり取りするデータを暗号化・復号化することでデータ通信を暗号化します。
SSH2の暗号化
SSH2ではSSH1のように同じ鍵、共通鍵の共有を行わない鍵共有方式を使うことでより安全性を高めいています。SSH2ではDH鍵共有方式というお互いの秘密キーの共有をしないでも暗号キーを共有する方法を使います。この暗号化方式ではお互いにペアキー(秘密・公開鍵)を発行し、公開鍵を互いの公開鍵を共有して共通鍵を生成して利用する方法です。
SSH2では2つの公開値と公開鍵を交換することで、計算式により同じ値を持った共通鍵を生成する鍵共有の方式です。modとは割り算によって出た余り値を出す計算式です(例:7 mod 4 = 3)。詳しくはDH鍵共有について下のリンクを参照してください。以下の数式では秘密鍵を逆算するのが困難です。このDH鍵共有によって共通鍵を流すことなく鍵共有が可能になる画期的な方法です。
参考記事のタイトルとURLを入力してください” target=”_blank” rel=”nofollow”]
ホストの認証
クライアントからサーバーに接続する際に相手のサーバーが本当に目的のサーバーか?というのを認証することをホスト認証(サーバー認証)といいます。ホスト認証はサーバーが発行したホストキー(公開鍵)を用いて行います。
ホスト認証の流れは
- クライアントがsshサーバーに接続
- クライアントの要求にsshサーバが発行した公開鍵をクライアントに送る
- クライアントはサーバーから送られてきた公開鍵が以前送られてきた公開鍵と同じか比較する。初めてなら~/.ssh/known_hostsに保存する
下図にホスト認証の流れを示しています。まずSSHクライアントがSSHサーバーへの接続を試みます。すると、サーバーはペアキーを生成して公開鍵をクライアントに送信します。クライアントはSSHサーバーを信頼する場合はその公開鍵を~/.ssh/known_hostsという場所に登録します。二回目以降はknown_hostsの公開鍵とSSHサーバーから送られてきた鍵と同じものかチェックして認証します。
SSHサーバーから送られてきたホストキーがおかしい場合はサーバーとの接続を切断します。同じ公開鍵を持っているかどうかは、公開鍵を使ってデータを暗号化したデータのハッシュ値を比較して行います。
パスワード認証
パスワード認証はssh接続するサーバーのユーザー名とパスワードで認証する認証方式です。
接続先サーバーのユーザー名とパスワードを知っていれば簡単に認証できるので家庭内などでssh接続したいときなどはこちらが便利です。しかし、セキリュティを重視する場合は公開鍵認証を利用したほうが良いです。パスワード認証の問題はパスワードのやり取りを行うので流出リスクがあります。
パスワード認証は設定ファイルsshd_configの初期設定で有効になっています(PasswordAuthentication yes)
パスワード認証の流れ
- セッションの暗号化
- ホストの認証
- クライアントはサーバーのユーザ名、パスワードを用いて認証する
です。
このSSH接続のセキュリティリスクとはいったい何でしょうか?
まず一点は、公開鍵を平文で送るという点が思いつくかもしれませんしかし、公開鍵は盗聴されても基本的には暗号化しかできないので危険性は少ないです。気になるようであればクライアントのknown_hostsに物理メディアを使って直接登録することでネット上に流さずに登録することも可能です。
二点目は暗号化されているとはいえパスワードをネット上に流すことです。暗号化は絶対に解読できないわけではなく、時間をかけると解読されるという認識でいたほうが安全です。ただのデータであればたとえ時間をかけて解読してもまだよいですが、パスワードを手に入れられてしまえばサーバーを意のままに操作されてしまうかもしれません。ここがパスワード認証の欠点といえます。
そこで公開鍵認証方式を使います。公開鍵認証方式とはお互いにおなじ公開鍵を持っている場合に
後述する公開鍵認証は暗号化しかできない鍵なので流出してもOKです。だから”公開” 鍵と呼ばれているのです。セキュリティを考えれば公開鍵認証のほうが安全です。
公開鍵認証
セキュリティの観点から公開鍵暗号方式が有用です。
公開鍵認証ではSSHクライアントが秘密鍵と公開鍵のペアを生成します。公開鍵はパスフレーズを使って暗号化します。これをSSHサーバーに渡してパスフレーズで復号化して公開鍵を共有します。この時セキュリティを考慮すると物理メディアで直接SSHサーバーの~/.ssh/authorized_keysに公開鍵の内容を登録するのが安全です。
公開鍵認証ではこの公開鍵を持っていればユーザー認証が可能なので、パスワードを通信に流さなくてもよいのでより安全です。
公開鍵と秘密鍵の生成
秘密鍵と公開鍵のペアを生成するにはssh-keygenコマンドを使います。
ssh-keygen -t dsa
コマンドを実行すると秘密鍵の復号に必要なパスフレーズが求められます。
秘密鍵id_dsaと公開鍵id_dsa.pubは~/.sshに生成します。
リモートホストへの公開鍵の登録
公開鍵認証をするにはリモートホストへ公開鍵を登録する必要があります。
~/.ssh/authorized_keysにid_dsa.pubの内容を追記します。
authotized_keyファイルのパーミッションはセキュリティの観点から600に設定することが望ましいです。ついでに./sshのパーミッションも700に変更しておきます。
公開鍵認証の有効化
公開鍵認証を有効化するためにはssh_configで
- PasswordAuthentication→No
- PubkeyAuthentication→Yes
として設定します。
参考 SSHの公開鍵認証における良くある誤解の話 - Qiita取得できませんでした
うまく接続できない時
ファイアウォールの設定を見直す
sshdの起動状態を確認する
sshがTCP22番でListenになっているかを確認
netstat -apn
アクセス拒否設定
初期値は全てのホストからのアクセスを許可しているので必要に応じて設定を変更する。
/etc/hosts.allow:許可するホスト
/etc/hosts.deny:拒否するホスト
IPアドレスを指定する。ネットワークアドレスを指定する事でネットワーク毎に設定することができます。
許可設定と拒否設定では許可設定が優先されます。許可も拒否もしなければ許可の設定がされます。
セキュリティの観点から、denyに sshd: ALLと記載して基本的に全てのsshdからの接続を拒否し、接続を許可するアドレスをallowにsshd: 192.168.2.0などと記載します。
アクセス制限はiptablesなどと組み合わせて利用します。