トップ  > サーバ設定:運用  > サーバ公開前のセキュリティ対策  > SSHサーバ構築(OpenSSH)-Installation from Source

SSHサーバ構築(OpenSSH)-Installation from Source  (最終更新日:2011/07/06)

SSHサーバは、Telnetサーバのようにクライアントからサーバへリモート接続して、遠隔地から操作することができるようにするサーバ。

Telnetは平文でそのままデータを送受信するのに対して、SSHでは暗号化してデータを送受信するので一定のセキュリティは保たれます。

今回は内部だけではなく外部からも出来るだけ安全にサーバにリモート接続できるようにする為、鍵方式によるログインのみを許可し、パスワードアタックで不正にログインされてしまわないようにする。

また、SSHサーバへの接続方式はより安全なSSH2のみとし、指定したユーザ以外が自身のホームディレクトリ以外を参照できないようにする。

SSHサーバを外部に公開しない場合は、標準でインストールされているSSHサーバによる、パスワード方式のログイン方法でも可。

ここでは、セキュリティの観点から本家より最新版をダウンロードしインストールする。

サーバへTelnet接続

画面とキーボードが用意でき直接ログインできる場合は、SSHサーバアンインストールへ進んで下さい。

OpenSSHをインストールする際、SSHサーバを削除するため、一時的にTelnetでWindowsからリモート接続できるようにします。

1.Telnetサーバインストール
[root@sv ~]# yum install telnet-server ← Telnetサーバインストール

[root@sv ~]# chkconfig telnet on ← Telnetサーバ有効化

[root@sv ~]# /etc/rc.d/init.d/xinetd restart ← Xinetd再起動(Telnetサーバ起動)
xinetd を停止中:                                           [  OK  ]
xinetd を起動中:                                           [  OK  ]
[root@sv ~]# exit ← 一般ユーザへ降格
[user_m@sv ~]$ exit ← ログアウト
2.Telnetでログイン

「ホスト」…「サーバのIPアドレス」

「プロトコル」…「Telnet」

「エンコーディング」…「utf-8」

を選択する

CentOS release 5.6 (Final)
Kernel 2.6.18-238.12.1.el5 on an x86_64
login: user_m ← Telnetでは直接rootでログインできない為一般ユーザでログイン
Password:  ← user_mのパスワード入力(非表示)
Last login: Wed Jul  6 00:38:08 from 192.168.0.1
[user_m@sv ~]$  ← 一般ユーザでログイン成功

[user_m@sv ~]$ su - ← rootへ昇格
パスワード:  ← rootのパスワード入力(非表示)

[root@sv ~]#  ← rootになれた

SSHサーバアンインストール

OpenSSHをインストールする為、現在インストールされているSSHサーバをアンインストールします

[root@sv ~]# /etc/rc.d/init.d/sshd stop ← SSHサーバ停止
sshd を停止中:                                             [  OK  ]

[root@sv ~]# yum remove openssh ← openssh関連パッケージアンインストール

SSHサーバインストール

[root@sv ~]# yum install pam-devel ← opensshのRPM作成に必要なパッケージをインストール

[root@sv ~]# wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.8p2.tar.gz
※最新版はこちらで確認。(2011/07/06時点。openssh-5.8p2.tar.gz)

[root@sv ~]# tar zxvf openssh-5.8p2.tar.gz ← ファイル展開

[root@sv ~]# vi openssh-5.8p2/contrib/redhat/openssh.spec ← specファイル編集
# Do we want to disable building of x11-askpass? (1=yes 0=no)
%define no_x11_askpass 0
	↓
%define no_x11_askpass 1 ← x11_askpassの無効化

# Do we want to disable building of gnome-askpass? (1=yes 0=no)
%define no_gnome_askpass 0
	↓
%define no_gnome_askpass 1 ← gnome_askpassの無効化

%configure \
	configure --without-zlib-version-check \ ← 追加(zlibのバージョンチェック無効化)
	--sysconfdir=%{_sysconfdir}/ssh \
	--libexecdir=%{_libexecdir}/openssh \
	--datadir=%{_datadir}/openssh \

[root@sv ~]# rm -rf openssh-5.8p2/contrib/aix/
[root@sv ~]# rm -rf openssh-5.8p2/contrib/hpux/
[root@sv ~]# rm -rf openssh-5.8p2/contrib/caldera/
[root@sv ~]# rm -rf openssh-5.8p2/contrib/suse/
[root@sv ~]# rm -rf openssh-5.8p2/contrib/cygwin/
[root@sv ~]# rm -rf openssh-5.8p2/contrib/solaris/
 ↑ redhat以外のディレクトリを削除

[root@sv ~]# tar czvf openssh-5.8p2.tar.gz openssh-5.8p2/ ← openssh展開先ディレクトリ再圧縮

[root@sv ~]# rm -rf openssh-5.8p2 ← openssh展開先ディレクトリ削除

[root@sv ~]# rpmbuild -tb --clean openssh-5.8p2.tar.gz ← RPMパッケージ作成
エラー: ビルド依存性の失敗:
        openssl-devel は openssh-5.8p2-1.x86_64 に必要とされています
        krb5-devel は openssh-5.8p2-1.x86_64 に必要とされています
が発生する場合、RPMを作成するのに必要なパッケージが不足しているので、全てインストールしてから再度実行します。
この場合yum install openssl-develyum install krb5-develとコマンド入力します。

[root@sv ~]# rpmbuild -tb --clean openssh-5.8p1.tar.gz ← RPMパッケージ作成(再実行)
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.82788
	・
	・
	・
+ rm -rf openssh-5.8p2
+ exit 0 ← RPMパッケージ作成成功

[root@sv ~]# cd /usr/src/redhat/RPMS/x86_64/ ← ディレクトリ移動
[root@sv x86_64]# ll ← パッケージの確認
-rw-r--r-- 1 root root 362235  7月  6 00:45 openssh-5.8p2-1.x86_64.rpm
-rw-r--r-- 1 root root 505102  7月  6 00:45 openssh-clients-5.8p2-1.x86_64.rpm
-rw-r--r-- 1 root root  16787  7月  6 00:45 openssh-debuginfo-5.8p2-1.x86_64.rpm
-rw-r--r-- 1 root root 302464  7月  6 00:45 openssh-server-5.8p2-1.x86_64.rpm

[root@sv x86_64]# rpm -Uvh openssh-5.8p2-1.x86_64.rpm ← opensshをインストール
準備中...                ########################################### [100%]
   1:openssh                ########################################### [100%]

[root@sv x86_64]# rpm -Uvh openssh-server-5.8p2-1.x86_64.rpm ← openssh-serverをインストール
準備中...                ########################################### [100%]
   1:openssh-server         ########################################### [100%]

[root@sv x86_64]# rpm -Uvh openssh-clients-5.8p2-1.x86_64.rpm ← openssh-clientsをインストール
準備中...                ########################################### [100%]
   1:openssh-clients        ########################################### [100%]

[root@sv x86_64]# mv openssh-* /root/app/ ← 作成したRPMパッケージは念のため保存

[root@sv x86_64]# cd ← カレントディレクトリへ戻る

[root@sv ~]# mv openssh-5.8p2.tar.gz app/ ← 再圧縮したファイルは念のため保存

SSHサーバ起動

[root@sv ~]# /etc/rc.d/init.d/sshd start ← SSHサーバ起動
sshd を起動中:                                             [  OK  ]

[root@sv ~]# chkconfig sshd on ← SSHサーバ自動起動設定

[root@sv ~]# chkconfig --list sshd ← SSHサーバ自動起動設定確認
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

Telnetサーバ削除

Telnet接続をログアウトしSSH接続でログインし直します。

直接ログインしていた方もここで終了です。

[root@sv ~]# chkconfig telnet off ← Telnetサーバ無効化

[root@sv ~]# /etc/rc.d/init.d/xinetd restart ← Xinetd再起動(Telnetサーバ停止)
xinetd を停止中:                                           [  OK  ]
xinetd を起動中:                                           [  OK  ]

[root@sv ~]# yum remove telnet-server ← Telnetサーバアンインストール

管理者ユーザ鍵方式ログインに設定

SSHサーバを鍵方式のみ許可に設定する前に、管理者ユーザを鍵方式でログインできるようにします。WindowsからSSHサーバへリモート接続(鍵方式ログイン)を参照

SSHサーバ設定

1.SSHサーバ設定
[root@sv ~]# vi /etc/ssh/sshd_config ← SSHサーバ設定ファイル編集

#Protocol 2
	↓
Protocol 2 ← SSH2でのみ接続を許可

#SyslogFacility AUTH
	↓
SyslogFacility AUTHPRIV ← ログを/var/log/secureに記録する※CentOSデフォルトに合わせる

#PermitRootLogin yes
	↓
PermitRootLogin no ← rootでのログインを禁止

#PasswordAuthentication yes
	↓
PasswordAuthentication no ← パスワードでのログインを禁止

#PermitEmptyPasswords no
	↓
PermitEmptyPasswords no ← パスワードなしでのログインを禁止
2.chroot設定

管理者用ユーザ以外が自身のホームディレクトリ以外を参照できないようにします。

[root@sv ~]# usermod -G wheel user_m ← 管理者ユーザー(例:user_m)をwheelグループに追加(初期設定で実施済みの場合は不要)

[root@sv ~]# vi /etc/ssh/sshd_config ← SSHサーバ設定ファイル編集
最終行へ以下を追加
Match Group *,!wheel
        ChrootDirectory /home/%u/./

SSHサーバ設定反映

1.SSHサーバ設定反映
[root@sv ~]# /etc/rc.d/init.d/sshd reload ← SSHサーバ設定反映
sshd を再読み込み中:                                       [  OK  ]
2.ポート22番の開放

ルータおよびファイアウォールの設定でポート22番を開放します。

ポートチェック【外部からポート開放確認】で「host名」にサーバ名(例:rx-93dff.net)、「port番号」に22と入力して「ポートチェック」ボタン押下し、「ホスト=rx-93dff.net ポート=22 にアクセスできました。」と表示されることを確認。

chrootユーザ作成(chroot設定時のみ)

1.chrootユーザ作成スクリプト作成
[root@sv ~]# mkdir -p ~/bin ← chrootユーザー作成スクリプト格納ディレクトリ作成

[root@sv ~]# vi ~/bin/chroot-useradd ← chrootユーザー作成スクリプト作成
ここから----------
#!/bin/bash
#
# Usage: ./chroot-useradd username [shell]
#

# Here specify the apps you want into the enviroment
CMD="bash ls touch mkdir cp mv rm pwd chmod cat vi id rsync ssh scp sftp ping ssh-keygen perl"
APPS=`which $CMD`
APPS="${APPS} /usr/libexec/openssh/sftp-server"

# Sanity check
if [ "$1" = "" ] ; then
    echo "  Usage: ./chroot-useradd username [shell]"
    exit 1
fi

# Obtain username and HomeDir
CHROOT_USERNAME=$1
if [ "$2" = "" ] ; then
    useradd $CHROOT_USERNAME
else
    useradd -s $2 $CHROOT_USERNAME
fi
chown root:root /home/$CHROOT_USERNAME
chmod 755 /home/$CHROOT_USERNAME
usermod -d /home/$CHROOT_USERNAME/./ $CHROOT_USERNAME
passwd $CHROOT_USERNAME
rm -f /home/$CHROOT_USERNAME/.* > /dev/null 2>&1
cd /home/$CHROOT_USERNAME/./

# Create Directories no one will do it for you
mkdir -p etc
mkdir -p bin
mkdir -p usr/bin
mkdir -p usr/local/bin
mkdir -p usr/libexec/openssh
MAKEDEV -d dev -x null zero

# Create short version to /usr/bin/groups
# On some system it requires /bin/sh, which is generally unnessesary in a  chroot cage
echo "#!/bin/bash" > usr/bin/groups
echo "id -Gn" >> usr/bin/groups
chmod 755 usr/bin/groups

# Add some users to ./etc/paswd
grep /etc/passwd -e "^root" -e "^$CHROOT_USERNAME" > etc/passwd
grep /etc/group -e "^root" -e "^$CHROOT_USERNAME" > etc/group

# Copy the apps and the related libs
for prog in $APPS;
do
    cp $prog ./$prog
    # obtain a list of related libraryes
    ldd $prog > /dev/null
    if [ "$?" = 0 ] ; then
        LIBS=`ldd $prog | awk '{ print $3 }'`
        for l in $LIBS;
        do
            mkdir -p ./`dirname $l` > /dev/null 2>&1
            cp $l ./$l > /dev/null 2>&1
        done
    fi
done

# From some strange reason these 4 libraries are not in the ldd output, but  without them
# some stuff will not work, like usr/bin/groups
cp /lib64/libnss_compat.so.2 lib64/
cp /lib64/libnsl.so.1 lib64/
cp /lib64/libnss_files.so.2 lib64/
cp /lib64/ld-linux-x86-64.so.2 ./lib64/
cp /lib64/libc.so.6 lib64/
cp /lib64/libm.so.6 lib64/
cp /lib64/libpthread.so.0 lib64/
cp /lib64/librt.so.1 lib64/
cp /lib64/libthread_db.so.1 lib64/

exit 0
----------ここまで

[root@sv ~]# chmod u+x ~/bin/chroot-useradd ← chrootユーザー環境作成スクリプトに実行権限付加
2.chrootユーザ作成

ホームディレクトリより上層へのアクセスを禁止するユーザ(ここではuser_noとする)の作成

[root@sv ~]# chroot-useradd user_no ← ユーザ作成
Changing password for user user_no.
New UNIX password: ← user_noのパスワード入力(非表示)
Retype new UNIX password: ← user_noのパスワード入力確認(非表示)
passwd: all authentication tokens updated successfully.

chrootユーザ鍵方式接続設定(chroot設定時のみ)

chrootユーザ用の鍵ペア作成、公開鍵セットアップをします。WindowsからSSHサーバへリモート接続(鍵方式ログイン)を参照

chrootユーザ動作確認(chroot設定時のみ)

chrootユーザでSSHサーバにログインします。

-bash-3.2$ pwd ← ホームディレクトリが/(ルート)になっているかpwdで確認
/ ← ホームディレクトリが/(ルート)になっている(これ以上、上層へ移動できない)

-bash-3.2$ su - ← rootになれるか確認
-bash: su: command not found ← rootになれない

SSHアクセス制限

SSHでは、ユーザ名とパスワードをランダムで総アタックしてくるツールがある為、サーバを運用していると

Invalid user fluffy from xxx.xxx.xxx.xxx

Invalid user admin from xxx.xxx.xxx.xxx

Invalid user test from xxx.xxx.xxx.xxx

Invalid user guest from xxx.xxx.xxx.xxx

のようなログが記録されるようになります。

パスワードによる認証は許可していないのでログインされてしまうことはありませんが、わずらわしいのでSSHサーバへアクセスできるホストを制限します。

[root@sv ~]# vi /etc/hosts.allow ← アクセス許可条件設定ファイル編集
最下部へ追加
sshd:   127.0.0.1 ← サーバ自身からSSHへのアクセス許可
sshd:   192.168.0. ← 内部ネットワークからSSHへのアクセス許可

[root@sv ~]# vi /etc/hosts.deny ← アクセス拒否条件設定ファイル編集
最下部へ追加
sshd:   ALL ← SSHへの全アクセス拒否

SSHポート変更

SSHは22番ポートが標準だが、IPTables log analyzerのログでは22番・23番ポートへのアクセスが非常に多い。

当サイトは鍵方式ログインの為、不正ログインされにくいがセキュリティ向上の為SSHのポートを22番から変更します。

ポート番号には決まりがあり、IANAが管理しています。

ポート番号の種類

種類範囲内容
WELL KNOWN PORT NUMBERS0 - 1023一般的なポート番号
REGISTERED PORT NUMBERS 1024 - 49151登録済みポート番号
DYNAMIC AND/OR PRIVATE PORTS49152 - 65535自由に使用できるポート番号

となっています。ただしあくまで指針であり強制力はなく自由なポート番号を使用することも可能ですが、混乱したり誤動作の原因となる為

DYNAMIC AND/OR PRIVATE PORTS(49152 - 65535)を使用するべきです。

ここでは例として65535を指定ポートにします。

1.ポート変更
[root@sv ~]# vi /etc/ssh/sshd_config ← SSHサーバ設定ファイル編集
#Port 22
Port 65535 ← 追加
2.サービス設定

サービスによってはポート番号指定ではなくプロトコル指定のあるため、sshが指定したポートで動作するように設定を変更する。

[root@sv ~]# vi /etc/services ← サービス設定ファイル編集

#ssh            22/tcp                          # SSH Remote Login Protocol ← 行頭に#を追加してコメントアウト
ssh             65535/tcp                       # SSH Remote Login Protocol ← 追加

#ssh            22/udp                          # SSH Remote Login Protocol ← 行頭に#を追加してコメントアウト
ssh             65535/udp                       # SSH Remote Login Protocol ← 追加
3.指定ポートの開放

ルータ及びファイアウォールで指定ポート(65535)を開放します。

ファイアウォールをサイト通りに設定している場合は以下の追加作業。

[root@sv ~]# vi iptables.sh ← ファイアウォール設定スクリプト編集
# 外部からのTCP22番ポート(SSH)へのアクセスを日本からのみ許可
# ※SSHサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 22 -j ACCEPT_COUNTRY
	↓
iptables -A INPUT -p tcp --dport 65535 -j ACCEPT_COUNTRY ← 変更

[root@sv ~]# ./iptables.sh ← ファイアウォール設定スクリプト実行
4.SSHサーバ設定反映
[root@sv ~]# /etc/rc.d/init.d/sshd restart ← SSHサーバ設定反映
sshd を停止中:                                             [  OK  ]
sshd を起動中:                                             [  OK  ]
5.Poderosa接続

ここで一旦ログアウトをし、「ファイル」-「新規Telnet/SSH接続」を選択。

「ポート」…65535を入力

接続成功