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

SSHサーバ構築(OpenSSH)-CentOS 6.0  (最終更新日:2012/10/27)

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

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

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

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

SSHサーバを外部に公開せず、内部も信頼できるなら、パスワード方式のログイン方法でも大丈夫です。

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

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

SSHサーバ設定

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

# Disable legacy (protocol version 1) support in the server for new
# installations. In future the default will change to require explicit
# activation of protocol 1
Protocol 2 ← SSH2でのみ接続を許可を確認

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

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
	↓
PermitEmptyPasswords no ← パスワードなしでのログインを禁止

PasswordAuthentication yes
	↓
PasswordAuthentication 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 restart ← SSHサーバ設定反映
sshd を停止中:                                             [  OK  ]
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 ← ユーザ作成
ユーザー user_no のパスワードを変更。
新しいパスワード: ← user_noのパスワード入力(非表示)
新しいパスワードを再入力してください: ← user_noのパスワード入力確認(非表示)
passwd: 全ての認証トークンが正しく更新できました。

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

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

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

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

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

-bash-4.1$ 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を入力

接続成功