⚠️ 記事内に広告を含みます。

SSHサーバーの構築 sshdを起動してリモート接続しよう!

SSHサーバーの構築

SSHはコマンドラインで遠隔地のコンピュータを操作する方法です。

サーバーの操作は基本的にはSSHを使ってサーバにログインして操作します。

SSHの知識やスキルはサーバエンジニアとして必須の基礎知識です。

ここではSSHを利用するための設定方法や操作方法などについて紹介します。

この記事の内容
重要度
(5.0)
優先度
(5.0)
基礎度
(4.0)
難易度
(2.0)

SSHとは?

SSHとはSecure SHellの略で、インターネットからサーバーをコマンドラインで操作する方法のことです。

サーバーは普通のコンピュータとは違ってシェルと呼ばれる黒い画面で操作します

シャットダウンコマンドの行先

シェルの画面

似たような方法にtelnetがありますがSSHには認証機能があるのでより安全で、telnetはリモートサーバの操作のためにはほとんど利用されていません。

TelnetとSSHの違いtelnetとsshの違いは何?

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サーバーにアクセスする方法を解説します。簡単な使い方については下の記事でも解説していますが、改めて書いていきます。

ラズベリーパイ3にSSH接続する方法を簡単に解説

1.SSHサーバーが起動したホストのIPアドレスを入力して接続します。

ssh リモートホストのユーザー名@サーバーのIPアドレス 例:ssh host@192.168.0.1 or ssh 192.168.0.1

始めての接続の場合はホスト鍵がまだ登録されていないので確認の表示がでます。ホストキーの確認は「~/.ssh/known_hosts」を参照すればわかります。

SSH接続の概要

SSH接続の概要

ローカルホストとリモートホスト

ローカルホストとは自分のパソコンで別のコンピュータに接続しようとした際に「自分側のコンピュータ」のことをローカルホストといいます。接続先のコンピュータは「リモートホスト」といいます。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では以下のディレクティブがあります。

  1. Port:ポート番号(22)
  2. AuthorizedKeyFile:公開鍵の置き場(.ssh/authorized_keys)
  3. LoginGraceTime:自動切断時間
  4. PasswordAuthentication:パスワード認証 (def. yes)
  5. PermitRootLogin:rootログインの可否
  6. PubkeyAuthentication:公開鍵認証設定
  7. RSAAuthentication : RSA認証の可否

sshd_configの構文チェック

sshd_configの構文に誤りがないかをsshd -tのコマンドでチェックできます。設定を変更した後は構文のチェックをしましょう。

sshd -t

構文チェック後はsshdを再起動します。

systemctl restart sshd

SSHのセキュリティ設定

SSHではクライアントはサーバー側のユーザとしてログインしてコンピュータを操作することが可能になるため、しっかりとセキュリティ対策が必要です。SSHでは安全なクライアントーホスト間通信を実現するための対策がいくつもあります。

  1. 通信の暗号化
  2. ホストの認証(クライアント視点でサーバーを認証する)
  3. ユーザー認証(サーバーへのクライアントの認証)

があります。先立って必要なのは通信の暗号化です。

通信の暗号化

通信データを暗号化せずにそのまま(平文)送信すると第三者に盗聴されると情報が漏洩してしまいます。そのため、通信内容は暗号化したほうが良いです。通信経路の暗号化は後述するユーザー認証よりも前に行われるものです。

SSHではSSH1とSSH2の二種類の方式があります。SSH2のほうがより安全であるためSSH1は原則利用しないです。今回はSSH1とSSH2の通信経路の暗号化の解説のため両方とも説明します。

SSH1の暗号化

SSH1では「共通鍵暗号方式」を使って通信を暗号化します。その際に利用するのがサーバーが発行する「サーバーキー」です。サーバーキーは公開鍵と秘密鍵のペアからなる鍵で公開鍵は暗号化のみ、秘密鍵は復号化を行うのに利用します。公開鍵からは秘密鍵を作り出すことはできません。そのため公開鍵が第三者に奪われても安全な仕組みになっています。

下の図のようにSSHクライアントからSSHサーバーに接続されるとサーバーは発行したサーバーキーの公開鍵をクライアントに送ります。クライアントはサーバーから公開鍵を受け取ると暗号化と復号化どちらもできる共通鍵(茶色)を発行してこれを公開鍵で暗号化してサーバーに送ります。するとサーバーは秘密鍵で復号化して共通鍵を入手します。これでクライアント、サーバーが同じ共通鍵を共有することができました(鍵交換)。

SSH1の通信暗号化法

SSH1の通信暗号化法

この共通鍵を使って今後やり取りするデータを暗号化・復号化することでデータ通信を暗号化します。

SSH1は共通鍵で通信を暗号化

SSH1は共通鍵で通信を暗号化

SSH2の暗号化

SSH2ではSSH1のように同じ鍵、共通鍵の共有を行わない鍵共有方式を使うことでより安全性を高めいています。SSH2ではDH鍵共有方式というお互いの秘密キーの共有をしないでも暗号キーを共有する方法を使います。この暗号化方式ではお互いにペアキー(秘密・公開鍵)を発行し、公開鍵を互いの公開鍵を共有して共通鍵を生成して利用する方法です。

SSH2では2つの公開値と公開鍵を交換することで、計算式により同じ値を持った共通鍵を生成する鍵共有の方式です。modとは割り算によって出た余り値を出す計算式です(例:7 mod 4 = 3)。詳しくはDH鍵共有について下のリンクを参照してください。以下の数式では秘密鍵を逆算するのが困難です。このDH鍵共有によって共通鍵を流すことなく鍵共有が可能になる画期的な方法です。

SSH2 DH鍵共有

SSH2 DH鍵共有

参考記事のタイトルとURLを入力してください” target=”_blank” rel=”nofollow”]

ホストの認証

クライアントからサーバーに接続する際に相手のサーバーが本当に目的のサーバーか?というのを認証することをホスト認証(サーバー認証)といいます。ホスト認証はサーバーが発行したホストキー(公開鍵)を用いて行います。

ホスト認証の流れは

  1. クライアントがsshサーバーに接続
  2. クライアントの要求にsshサーバが発行した公開鍵をクライアントに送る
  3. クライアントはサーバーから送られてきた公開鍵が以前送られてきた公開鍵と同じか比較する。初めてなら~/.ssh/known_hostsに保存する

下図にホスト認証の流れを示しています。まずSSHクライアントがSSHサーバーへの接続を試みます。すると、サーバーはペアキーを生成して公開鍵をクライアントに送信します。クライアントはSSHサーバーを信頼する場合はその公開鍵を~/.ssh/known_hostsという場所に登録します。二回目以降はknown_hostsの公開鍵とSSHサーバーから送られてきた鍵と同じものかチェックして認証します。

SSHサーバーの暗号化

SSHサーバーの暗号化

SSHサーバーから送られてきたホストキーがおかしい場合はサーバーとの接続を切断します。同じ公開鍵を持っているかどうかは、公開鍵を使ってデータを暗号化したデータのハッシュ値を比較して行います。

パスワード認証

パスワード認証はssh接続するサーバーのユーザー名とパスワードで認証する認証方式です。

SSHパスワード認証

SSHパスワード認証概略(簡略化)

接続先サーバーのユーザー名とパスワードを知っていれば簡単に認証できるので家庭内などでssh接続したいときなどはこちらが便利です。しかし、セキリュティを重視する場合は公開鍵認証を利用したほうが良いです。パスワード認証の問題はパスワードのやり取りを行うので流出リスクがあります。

パスワード認証は設定ファイルsshd_configの初期設定で有効になっています(PasswordAuthentication yes)

パスワード認証の流れ

  1. セッションの暗号化
  2. ホストの認証
  3. クライアントはサーバーのユーザ名、パスワードを用いて認証する

です。

sshパスワード認証を共通鍵暗号で

sshパスワード認証

このSSH接続のセキュリティリスクとはいったい何でしょうか?

まず一点は、公開鍵を平文で送るという点が思いつくかもしれませんしかし、公開鍵は盗聴されても基本的には暗号化しかできないので危険性は少ないです。気になるようであればクライアントのknown_hostsに物理メディアを使って直接登録することでネット上に流さずに登録することも可能です。

sshセキュリティリスク1

sshセキュリティリスク1

二点目は暗号化されているとはいえパスワードをネット上に流すことです。暗号化は絶対に解読できないわけではなく、時間をかけると解読されるという認識でいたほうが安全です。ただのデータであればたとえ時間をかけて解読してもまだよいですが、パスワードを手に入れられてしまえばサーバーを意のままに操作されてしまうかもしれません。ここがパスワード認証の欠点といえます。

sshセキュリティリスク2

sshセキュリティリスク2

そこで公開鍵認証方式を使います。公開鍵認証方式とはお互いにおなじ公開鍵を持っている場合に

後述する公開鍵認証は暗号化しかできない鍵なので流出してもOKです。だから”公開” 鍵と呼ばれているのです。セキュリティを考えれば公開鍵認証のほうが安全です。

known_hostsの内容

known_hostsの内容 IPアドレスと公開鍵のハッシュ値(楕円曲線DSA-SHA2-nitsp256は暗号化方式)

公開鍵認証

セキュリティの観点から公開鍵暗号方式が有用です。

公開鍵認証では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などと組み合わせて利用します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です