これまで構築してきた自宅サーバーによるサービスを,外出先からも利用できたら便利だ。そこで今回は,SSHサービスとポート・フォワードを設定し,外からも自宅サーバーを使えるようにしてみよう。

 連載の最後となる今回は,自宅サーバーでSSH(Secure Shell)サービスを稼働させる。SSHは,外部から自宅サーバーへのリモート・ログインを可能にするサービスだ。このSSHとポート・フォワード機能を併用すれば,SSHで接続したクライアントはLAN内に設置したように,メールやWebなどのサービスを利用できる。

 もちろん外部向けのサービスを稼働すれば,それだけ攻撃を受ける可能性が高くなる。そこで,よりセキュアに運用できるよう,公開鍵(かぎ)認証やファイアウオールを設定したSSHサーバーを構築しよう。

SSHの認証方法

 SSHを使って,外部からリモート・ログインを行うときのユーザー認証では,パスワード認証あるいは,より安全性の高い公開鍵認証を利用するのが一般的だ。

 前者はユーザー名とパスワードを使ったプレーン・テキストによる認証である。最近は国内外からSSHサーバーに対して,ユーザー名とパスワードを組み合わせた総当たり攻撃(ブルートフォース攻撃)が行われるようになった。パスワード認証を採用すると,侵入を許してしまう可能性は高い。

 一方の公開鍵認証は,サーバー側にクライアントの公開鍵を登録しておき,登録された公開鍵に合致する秘密鍵を持つクライアントだけにログインを許可させる方式だ。この方式なら秘密鍵が外部に流出しない限り安全だ。ただし,公開鍵をサーバーに登録する手間がかかる。

 自宅サーバーの場合,外部からの接続を許可するユーザー(クライアント)は少数だろう。そうであれば,より安全な公開鍵認証にするべきだ。今回は,公開鍵認証を行うSSHサービスを稼働させる。

SSHサービスの設定を行う

 CentOSでは,SSHサービス「OpenSSH」がデフォルト(初期設定)でインストールされている。設定ファイルは,/etc/ssh/ssd_configだ。まずは図1のように変更する。

Protocol 2
RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no
AllowUsers yoneda foobar
図1●/etc/ssh/ssd_configの設定ファイル

 デフォルトのままでは,多くの項目がコメント・アウトされており,図1の部分もコメント・アウトされている。まずは該当する行の「#」を削除する。

 「Protocol」はSSHプロトコルのバージョン2に限定する。もし,バージョン1を使うクライアントが残っていれば,デフォルトの「2,1」(バージョン2が優先されるが,バージョン1でも接続可能)のままにしておく。

 「RSAAuthentication」ではバージョン1の公開鍵認証の設定で,「yes」とする。「PubkeyAuthentication」はバージョン2の公開鍵認証の設定で,「yes」にする。「PasswordAuthentication」はパスワード認証の設定で,先に述べたように禁止する。

 「AllowUsers」は,SSHでログインできるユーザーを限定する。ユーザー名をスペース区切りで指定すればよい。AllowUsersに列挙されていないユーザーは,SSHを使用できない。

 続いて/etc/hosts.allowファイル,/etc/hosts.denyファイルの内容を変更する。これは,SSHサーバーのアクセス制御を行う設定ファイルだ。前者は接続を許可するIPアドレス,後者は許可しないIPアドレスを列挙する。前者は,後者より優先されるため,/etc/hosts.denyには「ALL:ALL」と1行だけ記述する。

 これで,原則すべてのアクセスが拒否される。続いて,/etc/hosts.allowに次のように記入しよう。

ALL: 127.0.0.0/255.0.0.0,192.168.1.0/255.255.255.0sshd: ALL

 今回の例は,SSHサーバーについてはすべてのアクセスを許可し(上記の「sshd: ALL」),その他についてはローカル・ホストとLAN(例では192.168.1.0/255.255.255.0)からのアクセスのみを許可している。本来ならSSHサーバーもアクセスできるIPアドレスを制限したいが,外出先のIPアドレスは特定できない場合が多く,ALLとした。

 以上を設定したら,次のコマンドをroot権限で実行して,SSHサーバーを再起動する。

# /etc/init.d/sshd restart

秘密鍵・公開鍵を作成する

 続いて,クライアント側で秘密鍵と公開鍵のペアを作成する。

Linuxで公開鍵を作成する

 公開鍵は,クライアントのパソコンで,ssh-keygenコマンドを使0って作成する。サーバーにログインするユーザーのアカウントに切り替え,図2のように実行する。

図2●ssh-keygenコマンドで鍵を作成する
図2●ssh-keygenコマンドで鍵を作成する
[画像のクリックで拡大表示]

 オプションの「-t」は鍵タイプを指定する。バージョン2のプロトコルでは,「rsa」と「dsa」が設定できる*1。ここではdsaの鍵を作成した。

 (1)は秘密鍵と公開鍵の保存先で,OpenSSHでは標準でホーム・ディレクトリの下の.sshディレクトリになる。

 (2)と(3)でパスフレーズを聞いてくるので,パスフレーズ*2を入力するか,または入力せずにEnterキーを押す。

 以上で~/.ssh/id_dsaという秘密鍵と,~/.ssh/id_dsa.pubという公開鍵が出来上がる。~/.ssh/id_dsa.pubを,CentOSサーバーの自分のホーム・ディレクトリにコピーしておこう。

Windowsで公開鍵を作成する

 Windows上で公開鍵を作成するツールとしては,「UTF-8 TeraTerm Pro with TTSSH2」が代表的だ。

 TeraTerm Proは寺西 高氏が作成した定番ターミナル・ソフトである。海外でSSH対応に拡張(TTSSH)されたが,UTF-8やSSHのバージョン2に対応しないまま,開発が終了してしまった。そこで,平田 豊氏が原作者の許可を得て拡張したのが,「UTF-8 TeraTerm Pro with TTSSH2」である。オープンソースとして公開されている。公式サイトから入手できる。

 TeraTerm Proを使って鍵を作成するときは,設定メニューの「SSHキー生成」を選択すればよい(写真1)。キーの種類に「DSA」を指定し,パスフレーズを入力すれば作成される。公開鍵は,Linuxと同様,サーバーにコピーしておこう。

写真1●WindowsでのSSHキーの作成画面
写真1●WindowsでのSSHキーの作成画面
UTF-8 TeraTerm Pro with TTSSH2を利用した。

サーバーで公開鍵を登録する

 コピーした公開鍵を,サーバー側に登録しよう。サーバー側の認証用の鍵ファイルは,「~/.ssh/authorized_keys」である。作成した公開鍵のあるホーム・ディレクトリ上で次のコマンドを実行すればよい。

$ cat id_dsa.pub >>~/.ssh/authorized_keys

 鍵はいくつでも登録できるので,ログインしたいクライアントの鍵は,上記のコマンドで次々と追加する。

 以上で,外部からSSHサービスを利用できるようになった。サーバーをルーターに接続している場合は,ルーターのTCPポートの22番を,サーバーに対して公開するよう設定する。

クライアントからの利用方法

 クライアント側からの利用法も簡単に紹介しておく。

Linuxクライアントから利用する

 クライアントのパソコンで稼働しているOpenSSHは,クライアント・ソフトとして利用できる。コンソールにログインするだけなら,次のコマンドを実行するだけだ。

$ ssh サーバーのIPアドレス

 リモート・ログインができたら,ポート・フォワード機能を試してみよう。クライアント側でポート・フォワードを設定すれば,外部からのリモート接続でも,LAN内に接続したようにメールを送受信できたり,LAN内に向けたWebサービスなどを利用できる。

 それでは,ポート・フォワードの設定を行ってみよう。コマンドで設定できるが,面倒なので設定ファイルを作成してしまおう。設定ファイルはユーザー・アカウントの~/.ssh/configだ。例を図3に示す。

Host my_centos
HostName 111.111.111.5           # 自宅のIPアドレス
User yoneda                      # ユーザー名
LocalForward 10110 localhost:110 # POP3
LocalForward 10143 localhost:143 # IMAP
LocalForward 10080 localhost:80  # web
図3●~/.ssh/configの設定例

 図3では,サーバーのポート110(POP3)をクライアントのポート10110に,サーバーのポート143(IMAP)をポート10143に,Webもポート80をポート10080にフォワードしている。このconfigファイルを作成し

$ ssh my_centos

とログインすれば,ポート・フォワードが有効になる。例えば,クライアント側のメール・ソフトでサーバーをlocalhostの10110とすればメールが受信できるし,「http://localhost:10080」にアクセスすればサーバーのWebページが表示できる。

Windowsクライアントから利用する

 Windowsでは,TeraTerm Proをクライアントとして利用できる。接続には,接続ダイアログでSSHを選択するだけでOKだ。

 TeraTerm Proにはポート・フォワード機能が備わっているが,ポート・フォワードだけを利用するなら「PortForwarder」というソフトが軽量で便利だ。OpenSSH互換のconfigファイルが利用できるので,図3を参考にして利用してほしい。

ブルートフォース攻撃を防ぐ

 SSHは便利だが,迷惑なのが前述したブルートフォース攻撃だ。SSHを外部に公開したら,必ずと言っていいほど1日に2回以上の攻撃が来る。1秒間に2回という激しいアタックもあり得るので,今回のような非力なサーバーでは無視できない。

 Linux標準のファイアウオール機能であるnetfilterを利用すれば,「1分間に5回以上連続でSSHに接続要求を送ってきたら,パケットを拒否する」といった設定ができる。ブルートフォース攻撃には有効な設定だ。

 netfilterによるパケット制御は,iptablesコマンドで設定する。図4の順にコマンドを実行していけばよい。最初のコマンド2つで,ssh_bluteとsshという2つのチェインを作成している。netfilterでは,チェインでパケットを定義し,条件に合致したパケットに対してどのような処理を行うのかを設定する。

# iptables -N ssh_blute
# iptables -N ssh
# iptables -A INPUT -j ssh -p tcp --dport 22
# iptables -A ssh_blute -m recent --name ssh_block --set -j
 LOG --log-level DEBUG --log-prefix "ssh_block: "
# iptables -A ssh_blute -j REJECT
# iptables -A ssh -p tcp ! --syn -m state --state ESTABLISHED,RELATED
 -j ACCEPT
# iptables -A ssh -p tcp --syn -m recent --name ssh_block
 --update --seconds 86400 -j REJECT --reject-with
 --reject-with icmp-port-unreachable
# iptables -A ssh -p tcp --syn -m recent --name ssh_conn --rcheck
 --seconds 60 --hitcount 5 -j ssh_blute
# iptables -A ssh -p tcp --syn -m recent --name ssh_conn --set
# iptables -A ssh -p tcp --syn -j ACCEPT
図4●SSHに対するブルートフォース攻撃をブロックする設定方法

 SSHチェインは,まず接続要求パケット(synパケット)以外は許可(ACCEPT)し,synパケットが1分間に5回以上連続した場合はssh_blockとしてssh_bluteチェーンに渡す設定にした。24時間(86400秒)以内にssh_blockと判断されたパケットは拒否する(REJECT)ようになっている。

 ssh_bluteチェーンでは,--log-levelで,指定したログを出力させている。これでブロックされた接続要求はログに残るわけだ。

 図4の処理ができたら,LAN内でテストして正しく機能するか確認しよう。OKなら,iptables-saveコマンドを使ってシステム設定ファイル(/etc/sysconfig/iptables)に設定を保存する。

# iptables-save ?etc/sysconfig/iptables

 これで,対策ができた。

 本連載は今回で終了だが,ノートPCでも自宅サーバーとして十分に利用できることが分かった。連載で紹介してきたように,自宅にサーバーがあると何かと便利である。連載を機会に,ぜひ読者も自宅サーバー計画を立て,実行に移してほしい。