コンテンツにスキップ

SSHサーバ構築

::リモートログイン
:::ターゲットコンピュータに直接ログインせずとも安全にインターネット経由でリモートログインできるようSSHサーバをインストールします。SSHサーバを利用することで、自宅などからそのコンピュータにアクセスすることが可能となるため大変便利です。またSSHの認証は公開鍵方式で行われ、通信経路も暗号化されるため現時点で非常に安全な通信手段だと言えます。SSHが登場する以前はリモートログインする手段として、平文(非暗号化通信)で通信するtelnetと呼ばれるものがありましたが、SSHがある現在では利用する機会は激減しています。

  • SSHサーバのインストールと設定
  • ファイアウォールの設定
  • PuTTYを使用してノートパソコンからパスワード認証で接続確認
  • マシンをB1に運びます
  • W311から踏み台サーバを経由しての接続確認
    • 踏み台サーバには公開鍵認証方式で接続
    • 自分のサーバにはパスワード認証で接続
  • 自分のサーバに公開鍵の登録、SSHサーバの設定変更
  • 公開鍵認証方式での自分のサーバへの再度接続確認

Fedora Core 2にはデフォルトでOpenSSHと呼ばれるSSH用サーバ・クライアントプログラムのパッケージが含まれています。OpenSSHのサーバプログラムはsshdです。サーバプログラムは常に接続を待ちながら動作し続けるためデーモンと呼ばれます。

SSHサーバがインストールされているかの確認

Section titled “SSHサーバがインストールされているかの確認”
[hoge@localhost hoge]# rpm -qa | grep ssh
openssh-server-3.6.1p2-34
openssh-3.6.1p2-34
openssh-clients-3.6.1p2-34

openssh-server-3.6.1p2-34がOpenSSHのサーバプログラムが含まれたパッケージです。

SSHサーバのインストール先の確認

Section titled “SSHサーバのインストール先の確認”
[hoge@localhost hoge]$ rpm -ql openssh-server
/etc/pam.d/sshd
/etc/rc.d/init.d/sshd
/etc/ssh
/etc/ssh/sshd_config
/usr/libexec/openssh/sftp-server
/usr/sbin/sshd
/usr/share/man/man5/sshd_config.5.gz
/usr/share/man/man8/sftp-server.8.gz
/usr/share/man/man8/sshd.8.gz
/var/empty/sshd

このパッケージに含まれているsshdデーモンの設定ファイルは/etc/ssh/sshd_configです。

sshdデーモンが動いているかどうか確認します。

[hoge@localhost hoge]$ ps aux | grep sshd
root 2922 0.0 0.4 4340 1116 ? S Jun28 0:00 /usr/local/sbin/sshd
  • すでにsshdが動いている人
    • ファイアウォールの設定に進んでください
  • 動いてない人
    • [root@localhost root]# /etc/init.d/sshd start
  • それでも動かない人
    • [root@localhost root]# tail /var/log/message に出力されるエラーメッセージを確認して対処してください。

SSHサーバ起動スクリプトの使い方

Section titled “SSHサーバ起動スクリプトの使い方”
[root@localhost root]$ /etc/init.d/sshd
使い方: /etc/init.d/sshd {start|stop|restart|reload|condrestart|status}

ファイアウォール(iptables)の設定

Section titled “ファイアウォール(iptables)の設定”

::ファイアウォールについて
:::コンピュータに出入りするパケットを指定した条件にフィルタリングする機能です。対象コンピュータに不必要なパケットを実処理プロセスに到達する前に破棄することで、セキュリティを向上させることが出来ます。

::iptablesについて
:::iptablesはLinuxに組み込まれているソフトウェアファイアウォールです。パケットフィルタリング機能に加え、NATやIPマスカレードなどの機能も提供します。

iptablesを設定するにはlokkit等のGUIツールがありますが、GUIツールを利用した場合、直感的に設定を行うことができる反面、複雑な設定がし難い欠点があります。今回はファイアウォールの理解をより深めるため、エディタで直接設定ファイルを編集します。

ファイアウォールを設定するにあたり、次のようなポリシーで実施することにします。

  • INPUT FOWARDに関しては
    • すべてのポートを閉じる
    • 必要なポートを空ける
  • OUTPUTに関しては
    • すべてのポートを通す

SSHサーバに必要なポートは22(tcp)です。Fedora Coreで利用されるファイアウォールの設定は、/etc/sysconfig/iptablesに保存されています。ファイアウォールのための起動スクリプト(/etc/init.d/iptables)によって、起動時に設定をロード、終了時に設置状況が保存されます。

実際に設定ファイルを編集する前に、誤って設定ファイルを設定してしまった時のためにバックアップを取っておいてください。
※ 設定ファイルのバックアップは別のアプリケーションを構築する時などでも必ず行うようにしてください。

[root@localhost root]# cp /etc/sysconfig/iptables /etc/sysconfig/iptables.default

それではエディタを使って次のように編集します。

[root@localhost root]# vi /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type any -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT <- この行を追加
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
*filter定型部
:INPUT DROP [0:0]定義されていない入力パケットをすべて破棄
:FORWARD DROP [0:0]定義されていないフォワード用パケットをすべて破棄
:OUTPUT ACCEPT [0:0]定義されていない出力パケットをすべて許可
-A INPUT -i lo -j ACCEPTループバックアドレスからの入力パケットをすべて許可
-A INPUT -p icmp —icmp-type any -j ACCEPTすべてのICMP用入力パケットを許可
-A INPUT -p tcp -m tcp —dport 22 -j ACCEPTSSHD用入力パケットを許可
-A INPUT -m state —state ESTABLISHED、RELATED -j ACCEPTセッションが確立しているかそれに関連がある入力パケットを許可(注: 実際の設定ファイルではESTABLISHEDとRELATEDの間の句読点は半角のカンマです。)
-A INPUT -j REJECT —reject-with icmp-host-prohibitedすべての入力パケットを拒絶
COMMIT定型部

今回紹介した以外のiptablesの利用方法は、各自Google等で調べてください。

設定ファイルはroot以外のユーザに参照されるべきではありません。設定ファイルのパーミッションを変更します。

[root@localhost root]# chmod 600 /etc/sysconfig/iptables

ファイアウォールの設定を有効にする

Section titled “ファイアウォールの設定を有効にする”

編集した設定を反映するにはiptablesを再起動する必要があります。

[root@localhost root]# /etc/init.d/iptables restart
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
Applying iptables firewall rules: [ OK ]

ここで[ FAILED ]が出てしまった場合は、ファイアウォールが機能していない状態になるため、有効になるまで次に進んではいけません。今一度、設定ファイルを見直してください。

PuTTYはWindows用のsshクライアントプログラムです。

ノートPCを使って各自のサーバマシンのSSHサーバにアクセスしてみます。ノートPCを持って演習室スクリーン下の中央テーブルに来てください。

同じネットワーク内なので、踏み台サーバの経由はせずにダイレクトにアクセスします。

  • [PuTTY]
    カテゴリ設定項目
    セッションホスト名各自のサーバマシンのIP(上記『xx』にはマシン番号が入ります)
    ポート22
    プロトコルSSH
    変換受信されるデータの文字セット変換UTF-8
    接続自動ログインのユーザ名自分で作った一般ユーザ名
    • セッション

PuTTY_setting1.png

  • 変換

PuTTY_setting2.png

  • 接続

PuTTY_setting3.png
以上の設定ができたら、一度セッションに戻って、保存してください。

新たに作ったセッションをダブルクリックして接続します。

  • アクセスできた人

    • マシンをB1へ移動してください
  • アクセスできなかった人

    • ノートパソコンのIPアドレスが取れているか。
    • LAN線がしっかり差し込まれているか。
    • PuTTYの接続先が間違っていないか。
    • PuTTYのログイン名が正しいか。
    • サーバマシンのsshdデーモンが動いているか。
    • サーバマシンのファイアウォールの設定が正しくできているか。
    • サーバマシンのログインしようとしている一般ユーザのパスワードを設定しているか。

自分のサーバマシンと付属品一式を持ってそのテーブル担当のRATの人と一緒にB1に移動してください。
B1ではRATの人の指示に従ってマシンを置いてください。
設置作業が終わったら、マシンの電源を入れて、共通に戻ります。

ここからは隣の教室(W311教室)での作業です。
構築したSSHサーバはB1のLAN内に配置されています。
外から直接アクセスすることはできないので、踏み台サーバ(step.cis.k.hosei.ac.jp)を経由してアクセスします。

踏み台サーバを利用するには、情報科学部サーバ(ラボ教室用アプリケーションサーバ)用の公開鍵登録を済ませている必要があります。

リテラシ環境では以下のようなポートフォワードを行います。

ポートフォワード:localhost:10022 -> 踏み台サーバ -> 自分のサーバマシン:22

SSH.png

::ポートフォワーディング
:::ローカルコンピュータの特定のポートに送られてきたデータを、別に用意した通信経路を用いてリモートコンピュータの特定ポートに送信することです。通信経路を暗号化してセキュリティを高める用途に用いられることが多いため、ほとんどの場合はSSH等の暗号化技術が併用されます。

::ポートフォワーディングのメリット
:::LAN内などのローカルネットワークからの接続しか許可していないサーバに対して、いったん目的のサーバと同じネットワークにあるコンピュータにログインし、内部ネットワークからの通信としてサーバに接続を要求するという形を取れます。目的のサーバが外部ネットワークからの接続を認めている場合も、相手ネットワークまでの通信経路を暗号化することで安全性の高い通信が可能になります。

::なぜ踏み台サーバを使うのか
:::個々のマシンにグローバルIPを割り振るほどIPが無く、そのような環境にでも外部から接続できるようにするためです。また踏み台サーバを経由しない限り外部から各自のサーバマシンに直接接続できないことによる、安全な演習環境を実現するためです。

踏み台マシンにログインするためのPuTTYの設定を行います。

  • [PuTTY]
    カテゴリ設定項目
    セッションホスト名step.cis.k.hosei.ac.jp
    ポート22
    プロトコルSSH
    変換受信されるデータの文字セット変換UTF-8
    接続自動ログインのユーザ名自分のアプリケーションサーバのログイン名
    接続-SSH-認証認証のためのプライベートキーファイル自分の秘密鍵を指定してください
    接続-SSH-トンネル源ポート10022
    送り先[自分のサーバマシンのIPアドレス]:22
    • セッション

PuTTY_setting4.png

  • 接続

PuTTY_setting6.png

  • 認証

PuTTY_setting7.png

  • トンネル ※送り先、のチェックはローカルです。

※トンネルの部分は値を入れたら追加ボタンを押してください。

PuTTY_setting8.png

以上の設定ができたら、一度セッションに戻って、保存してください。

新たに作った踏み台へのセッションをダブルクリックして接続します。
※ログイン名とパスフレーズは情報科学部アカウントと同じになります。

  • ログインが成功した人
    • 各自のサーバマシンにログインする、へ進んでください。
  • ログインできない人
    • W311から行っているか(共通では繋がりません)。
    • https://auth/の認証を行っているか。
    • ノートパソコンのIPアドレスが取れているか。
    • LAN線がしっかり差し込まれているか。
    • PuTTYの接続先が間違っていないか。
    • PuTTYのログイン名が正しいか。
    • PuTTYの秘密鍵を指定しているか。
    • アプリケーションサーバに公開鍵を登録しているか。

各自のサーバマシンにログインする

Section titled “各自のサーバマシンにログインする”

上記のPuTTYのアクセスで次のような接続が可能となります。

ノートPC(localhost):10022 -> 踏み台サーバ -> 自分のサーバマシン:22

ポートフォワードをしているので、接続先のホスト名はlocalhostでポート番号は設定した10022になります。
新しくPuTTYを起動してください。

  • [PuTTY]
    カテゴリ設定項目
    セッションホスト名localhost
    ポート10022
    プロトコルSSH
    変換受信されるデータの文字セット変換UTF-8
    接続自動ログインのユーザ名自分で作った一般ユーザ名
    • セッション

PuTTY_setting9.png

  • 接続

PuTTY_setting11.png
以上の設定ができたら、一度セッションに戻って、保存してください。

この時点でPuTTYは、「踏み台サーバ」と「各自のサーバマシン」の2つの接続を行っています。踏み台サーバのPuTTYを終了すると各自のサーバマシンへの接続は切断されてしまいますので注意してください。

  • ログインが成功した人
    • 各自のサーバマシンにログインできたら、へ進んでください。
  • ログインできない人
    • PuTTYの接続先が間違っていないか。
    • PuTTYのログイン名が正しいか。
    • 上の踏み台サーバ接続において、ポートフォワーディングの項目を設定しているか。
    • ポートフォワーディングの指定先、アドレスが間違っていないか。

各自のサーバマシンにログインできたら

Section titled “各自のサーバマシンにログインできたら”

各自のサーバマシンの一般ユーザに公開鍵を登録します

Section titled “各自のサーバマシンの一般ユーザに公開鍵を登録します”
[hoge@localhost hoge]$ mkdir ~/.ssh
[hoge@localhost hoge]$ vi ~/.ssh/authorized_keys

i 』を押して、viを『インサートモード』にします。公開鍵をコピーし、vi上でマウスの右クリックで貼り付けます。
このとき、インサートモードで貼り付けが行われていないと、正しく公開鍵が貼り付けられません。貼り付けた鍵の先頭が『ssh…』で始まっていることを確認してください。
※ 『 ~ 』はユーザのホームディレクトリを指します。

.sshフォルダには公開鍵以外にも利用方法によっては重要なファイルが配置されるため、パーミッションのチェックが厳しいです。次のように所有者以外のユーザアクセスができないようにしないと公開鍵認証方式でのログインが拒絶されます。

[hoge@localhost hoge]$ chmod 700 ~/.ssh
[hoge@localhost hoge]$ chmod 600 ~/.ssh/authorized_keys

安全にsshdを運用できるように設定を変更する必要があります。設定ファイルで『 # 』を先頭につけるとコメントアウトすることができます。コメントアウトされている設定はデフォルトの設定です。

デフォルトではrootのログイン等を許可しているので、設定を変更する必要があります。
デフォルトのSSHサーバの設定は、以下の点でセキュリティ上問題があるので変更してください。

設定説明問題点
PermitRootLoginyes/norootでのログインを許可するかどうか直接rootユーザのパスワードを解析される可能性がある
PasswordAuthenticationyes/noパスワードログインを許可許可した場合、公開鍵を使用しなくてもログインできる
ChallengeResponseAuthenticationyes/noチャレンジ・レスポンス認証を許可推奨されていない

sshdデーモンの設定ファイルは/etc/ssh/sshd_configです。設定を編集する前にiptablesの設定ファイル同様バックアップを取っておいてください。

[root@localhost root]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
[root@localhost root]# vi /etc/ssh/sshd_config

次の様に変更します。

PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no

変更した設定を反映するにはsshdデーモンを再起動する必要があります。

[root@localhost root]# /etc/init.d/sshd restart

公開鍵認証方式で自分のサーバマシンにログイン

Section titled “公開鍵認証方式で自分のサーバマシンにログイン”

公開鍵の登録に失敗している可能性もあるので、現在のターミナル(PuTTYのウインドウ)を閉じないでおいて、新しくPuTTYのウインドウを開きましょう。

  • PuTTY 上での設定に加えて、秘密鍵の指定を追加したセッションを作る。
    カテゴリ設定項目
    セッションホスト名localhost
    ポート10022
    プロトコルSSH
    変換受信されるデータの文字セット変換UTF-8
    接続自動ログインのユーザ名自分で作った一般ユーザ名
    接続-SSH-認証認証のためのプライベートキーファイル自分の秘密鍵を指定してください
    • 認証

PuTTY_setting12.png
以上の設定ができたら、一度セッションに戻って、保存してください。

公開鍵認証方式でのログインが成功した場合は、次のように出力されます。

login as: user1
Authenticating with public key "user1@localhost"
Passphrase for key "user1@localhost":

user1はログインする一般ユーザ名。

  • 無事ログインできた人
    • 今日のサーバリテラシは終わりです。お疲れ様でした。最後に、を読んでください。
  • ログインできなかった人(接続してあるPuTTYのウインドウで下記を確かめてください)
    • ~/ssh のディレクトリのパーミッションが700になっているか。
    • 設定ファイル /etc/ssh/sshd_config が正しく編集できているか。
    • sshdデーモンが動いているか。
    • PuTTYの秘密鍵の指定が間違っていないか。

SSHサーバを構築したことにより、今後ネットワーク経由で各自のサーバマシンにログインすることができるようになりました。しかし今回のサーバリテラシでは必要最小限のことしか説明しておらず、今後サーバを運用していくにはまだまだLinuxやサーバについて多くのことを学ぶ必要があります。実際にグローバルIPを持った環境でサーバを構築する際は、各自でさらにスキルを向上させ、安全に運用するためにはどうしたら良いのかについて十分理解してから実施するようにしてください。