LinuxシステムのVPSまたはサーバーを購入した後、多くのプロバイダーはroot権限のアカウントを提供しますが、初期パスワードは短く設定されていることが多く、これは非常に危険です。脆弱なパスワードにより、サーバーが不正アクセスされ悪用されるケースが頻繁に発生しています。そのため、LinuxシステムのVPSまたはサーバーをセットアップした後、基本的なセキュリティ設定を行う必要があります。
1. SSHパスワード認証の無効化
まず、SSHキーペアを生成する必要があります。Windowsユーザーの場合は、PuttyのPUTTYGEN.EXEを使用して秘密鍵と公開鍵を作成します。
PUTTYGEN.EXEを実行し、通常はデフォルトのRSA暗号を選択します。1024ビットの暗号化で十分ですが、より安全性を高める場合は2048または4096ビットを選択できます。
Generateボタンをクリックし、マウスをランダムに動かします。プログレスバーが完了すれば、SSHキーが生成されます。
より安全にするためにはKey Passphrase(パスフレーズ)を設定することをお勧めします。これはrootパスワードとは異なるパスワードで、他人があなたのキーを取得してもこのパスフレーズがなければキーを使用できません。
Save Public Keyをクリックして公開鍵を保存します。ファイルの内容は以下のようになります:
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "secure-server-key-20230815"
AAAAB3NzaC1yc2EAAAADAQABAAABAQC9t6Jz2Qy7YqX8hLJ7H2y5wF8vR6T9K0l
P8mN4oP5qR7sT8uV9xY3aB4cD5eF6gH7iJ8kL9mN0oP1qR2sT3uV4xY5aB6cD7e
F8gH9iJ0kL1mN2oP3qR4sT5uV6xY7aB8cD9eF0gH1iJ2kL3mN4oP5qR6sT7uV8x
Y9aB0cD1eF2gH3iJ4kL5mN6oP7qR8sT9uV0xY1aB2cD3eF4gH5iJ6kL7mN8oP9q
R0sT1uV2xY3aB4cD5eF6gH7iJ8kL9mN0oP1qR2sT3uV4xY5aB6cD7eF8gH9iJ0kL
---- END SSH2 PUBLIC KEY ----
中の長い文字列が公開鍵です。サーバーの~/.ssh/authorized_keysに以下の形式で配置します:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9t6Jz2Qy7YqX8hLJ7H2y5wF8vR6T9K0l
P8mN4oP5qR7sT8uV9xY3aB4cD5eF6gH7iJ8kL9mN0oP1qR2sT3uV4xY5aB6cD7eF8gH
9iJ0kL1mN2oP3qR4sT5uV6xY7aB8cD9eF0gH1iJ2kL3mN4oP5qR6sT7uV8xY9aB0cD
1eF2gH3iJ4kL5mN6oP7qR8sT9uV0xY1aB2cD3eF4gH5iJ6kL7mN8oP9qR0sT1uV2x
Y3aB4cD5eF6gH7iJ8kL9mN0oP1qR2sT3uV4xY5aB6cD7eF8gH9iJ0kL secure-server-key-20230815
ここでssh-rsaは暗号化タイプ、secure-server-key-20230815は説明文で任意のテキストを使用できます。
Save Private KeyをクリックしてPutty用の秘密鍵を生成し、secure_server.ppkとして保存します。このファイルはPuttyディレクトリのPAGEANT.EXEでインポートすることで、rootパスワードなしでVPSにログインできます。
Windowsユーザーの場合は、公開鍵をサーバーにインポートする方法として2つの簡単な方法があります:
- 公開鍵をhttps://launchpad.net/サイトにアップロードし、https://launchpad.net/~username/+sshkeysのようなアドレスを取得して、以下のコマンドでキーをインポートします:
curl https://launchpad.net/~username/+sshkeys > ~/.ssh/authorized_keys
.sshディレクトリがない場合は新しく作成します:
mkdir .ssh
- authorized_keysファイルに直接書き込む方法:
cat >>/root/.ssh/authorized_keys<< EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9t6Jz2Qy7YqX8hLJ7H2y5wF8vR6T9K0l
P8mN4oP5qR7sT8uV9xY3aB4cD5eF6gH7iJ8kL9mN0oP1qR2sT3uV4xY5aB6cD7eF8gH
9iJ0kL1mN2oP3qR4sT5uV6xY7aB8cD9eF0gH1iJ2kL3mN4oP5qR6sT7uV8xY9aB0cD
1eF2gH3iJ4kL5mN6oP7qR8sT9uV0xY1aB2cD3eF4gH5iJ6kL7mN8oP9qR0sT1uV2x
Y3aB4cD5eF6gH7iJ8kL9mN0oP1qR2sT3uV4xY5aB6cD7eF8gH9iJ0kL secure-server-key-20230815
EOF
CentOSシステムでSELinuxが有効になっている場合、.sshディレクトリのアクセスが制限されている可能性があります:
restorecon -R -v /root/.ssh
authorized_keysの権限問題が発生した場合は、以下のコマンドで解決できます:
chattr -i authorized_keys
新しいSSHウィンドウを開いて、パスワードなしでrootとしてログインできるかテストします。
次に、SSHパスワード認証を無効化します。SSH設定ファイルを編集します:
vim /etc/ssh/sshd_config
#PasswordAuthentication yesを見つけてPasswordAuthentication noに変更し、保存して終了します。SSHサービスを再起動します:
Ubuntuの場合:
/etc/init.d/ssh restart
CentOSの場合:
service sshd restart
これでSSHパスワード認証が無効化され、90%の不正アクセスリスクを排除できます。ただし、秘密鍵は安全に保管してください。
2. CSFファイアウォールのインストールと不正アクセス元IPのブロック
CSFファイアウォールのインストールは簡単で、数コマンドで完了します:
rm -fv csf.tgz
wget http://www.configserver.com/free/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh
以下のコマンドでインストールが成功したか確認します:
perl /usr/local/csf/bin/csftest.pl
システムがローカルIPを誤ってブロックしないように、/etc/csf/csf.allowと/etc/csf/csf.ignoreファイルに必要なIPをホワイトリストとして追加します。その後、csf -rコマンドで設定を再読み込みします。
3. iptablesで通常のポートのみを許可
一般的には22、53、80、443のポートを開放すれば十分です。以下のコマンドでiptablesのデフォルトルールをクリアします:
iptables -F
22番ポートの入出力を許可:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
53番ポートの許可(DNSサービス用):
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
ローカルループバックアクセスの許可:
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
80番と443番ポートの全IPからのアクセス許可(HTTP/HTTPS用):
iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
設定を保存:
iptables-save > /etc/sysconfig/iptables
iptablesを再読み込み:
iptables -L
4. fail2banのインストールとSSHポートスキャンIPのブロックと報告
SSHパスワードを継続的にスキャンしている攻撃者に対処するために、fail2banをインストールします。これにより、不正アクセス元IPをブロックすると同時に、そのIPが属するISPに自動で報告メールを送信できます。
CentOSでのインストール: epelリポジトリをインポート:
#CentOS 6.x 32ビット:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
#CentOS 6.x 64ビット:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
#fail2banのインストール
yum -y install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
service fail2ban start
Ubuntu/Debianでのインストール:
apt-get install fail2ban -y
/var/log/fail2ban.logファイルを確認することで、SSHスキャンを試みているIPアドレスを確認できます。