SSHサーバー構築(OpenSSH)

最終更新日: 2012.06.22

<<トップページ <<新着情報 <<サイト内検索 <<CentOSで自宅サーバー構築 <<Fedoraで自宅サーバー構築

■概要

SSHサーバーは、Telnet同様にクライアントからサーバーへリモート接続して、遠隔地からサーバーを操作することができるようにするためのサーバー。
ただし、Telnetが暗号化しないでそのままデータを送受信するのに対して、SSHでは通信内容を暗号化するため、通信内容を盗み見られても問題ない。
ここでは、内部からだけではなく外部からも安全にサーバーにリモート接続できるようにするため、鍵方式によるログインのみを許可することにより、クラッカーによるパスワードアタックで不正にSSHサーバーへログインされてしまわないようにする。
また、SSHサーバーへの接続方式にはSSH1とSSH2があるが(SSH1とSSH2の違いについて)、より安全なSSH2による接続のみ許可することとする。
さらに、SSHログインしたユーザーが自身のホームディレクトリ以外を参照できないようにする。

なお、SSHサーバーを外部に開放せず、内部ユーザーも信頼できる場合は、SSHサーバーの設定はデフォルトのままで、パスワード方式によるログイン方式でもよい。


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

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

■SSHサーバー設定

(1)SSHサーバー設定
[root@scientific ~]# vi /etc/ssh/sshd_config ← SSHサーバー設定ファイル編集
#Protocol 2,1
↓
Protocol 2 ← SSH2のみで接続を許可

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

#PasswordAuthentication yes
↓
PasswordAuthentication no ← パスワードでのログインを禁止(鍵方式によるログインのみ許可)

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

(2)chroot設定
管理者用ユーザー(wheelグループ所属ユーザー)を除いて、一般ユーザーが自身のホームディレクトリ以外を参照できないようにする。
[root@scientific ~]# usermod -G wheel scientific ← 管理者ユーザー(例:scientific)をwheelグループに追加

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

■SSHサーバー再起動

(1)SSHサーバー再起動
[root@scientific ~]# /etc/rc.d/init.d/sshd restart ← SSHサーバー再起動
sshdを停止中:                                              [  OK  ]
sshdを起動中:                                              [  OK  ]

(2)ポート22番のOPEN
ルーター側の設定でポート22番をOPENする。
※ルーターの設定は各ルーターのマニュアルまたはメーカー別ルーターポート開放手順を参照

ポートチェック【外部からポート開放確認】で「ホスト名(FQDN)またはIPアドレス」にサーバー名(例:scientificsrv.com)、「port番号」に22と入力して「ポートチェック実行」ボタンを押下し、「ホスト:scientificsrv.com ポート:22 にアクセスできました。」と表示されることを確認。

■chrootユーザー作成※chroot設定時のみ

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

[root@scientific ~]# 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 /lib/libnss_compat.so.2 lib/
cp /lib/libnsl.so.1 lib/
cp /lib/libnss_files.so.2 lib/
cp /lib/ld-linux.so.2 ./lib/
cp /lib/libc.so.6 lib/
cp /lib/libm.so.6 lib/
cp /lib/libpthread.so.0 lib/
cp /lib/librt.so.1 lib/
cp /lib/libthread_db.so.1 lib/

exit 0


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

(2)chrootユーザー作成
ホームディレクトリより上層へのアクセスを禁止するユーザー(ここではscientificuserとする)の作成
[root@scientific ~]# chroot-useradd scientificuser ← ユーザー作成
ユーザー scientificuser のパスワードを変更。
新しいパスワード: ← ユーザーパスワード応答
新しいパスワードを再入力してください: ← ユーザーパスワード応答(確認)
passwd: 全ての認証トークンが正しく更新できました。

■chrootユーザー鍵方式接続設定※chroot設定時のみ

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

■chrootユーザー確認※chroot設定時のみ

chrootユーザーでSSHサーバーにログインする。
-bash-4.1$ pwd ← ホームディレクトリが/(ルート)になっているかpwdで確認
/ ← ホームディレクトリが/(ルート)になっている(これ以上、上層へ移動できない)

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

■SSHアクセス制限

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
Invalid user webmaster from xxx.xxx.xxx.xxx
Invalid user mysql from xxx.xxx.xxx.xxx
Invalid user oracle from xxx.xxx.xxx.xxx

[root@scientific ~]# echo sshd:127.0.0.1 >> /etc/hosts.allow ← サーバー自身からのsshへのアクセスを許可

[root@scientific ~]# echo "sshd: 192.168.1." >> /etc/hosts.allow ← 内部(例:192.168.1.XXXからのsshアクセスを許可)

[root@scientific ~]# echo "sshd: .ppp.asahi-net.or.jp"  >> /etc/hosts.allow ← 外部(例:xxx.ppp.asahi-net.or.jpからのsshアクセスを許可)

[root@scientific ~]# echo "sshd: ALL" >> /etc/hosts.deny ← sshへの全てのアクセスを禁止
※上記では、内部(例:192.168.1.XXX)と外部(例:xxx.ppp.asahi-net.or.jp)からのみ、SSHへのアクセスを許可している






▲このページのトップへ戻る

LPIロゴ Copyright© 2011-2017 fallenangels, All rights reserved.
ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします