公開サーバーの bash を安全に実行する方法
SSH アクセスの保護#
SSH は bash への重要な入り口であり、デフォルトのポート 22 で直接公開することは非常に危険です。軽い場合はデータの損失や財産の損失が発生します💔、重い場合は他人に害を及ぼすツールとして悪用される可能性があります😨 そのため、クラウドサーバーの bash に安全にアクセスする方法は、大きな問題となっています⁉️。
ポートの変更とログイン権限の設定 デフォルトのポート 22 は一般的なポートよりも優先して変更されるべきです。また、パスワードログインを無効にし、鍵🔑を使用したログインに変更する必要があります。
> vim /etc/ssh/sshd_config
Port 変更後のポート番号
PasswordAuthentication no
PubkeyAuthentication yes
ファイアウォールの有効化#
一般的に、クラウドプラットフォームは基本的なプラットフォームファイアウォールを提供し、ホストファイアウォールと組み合わせることで一定の侵入攻撃に対抗できます。
ファイアウォールでソース IP のアクセスを制限する 固定のパブリック IP を持つユーザーや企業の場合、ホストファイアウォールでソース IP のアクセスを制限するだけで十分です。firewalld ファイアウォールの設定例:
> firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="クライアントのIP" port ptocol="tcp" port="SSHのポート番号" accept' --permanent
ufw ファイアウォールの設定例:
> ufw allow from クライアントのIP to any port SSHのポート番号
iptables ファイアウォールの設定例:
> iptables -A INPUT -p tcp --dport SSHのポート番号 -s クライアントのIP -j ACCEPT
動的なパブリック IP のアクセス制限#
固定のパブリック IP や専用回線を持たないユーザーの場合、DDNS と bash スクリプトを使用して動的なアクセス元の制限を実現する必要があります。原理は以下の図の通りです👇:
まず、ドメインを購入する必要があります。無料のものでも構いません。一般的な DDNS ツールには、阿里云 ddns、腾讯 ddns、ddns-go などがあります。
次に、スクリプトを作成してドメインが指す動的な IP アドレスを取得します(原理は DDNS と似ています)。ufw ファイアウォールを例に説明します。
#!/bin/bash
# 変数の初期化
current_time=$(date "+%Y-%m-%d %H:%M:%S")
DOMAIN="自分のドメイン"
DOMAIN_IP=$(nslookup $DOMAIN | awk '/^Address: / { print $2 }')
LOG_FILE="/var/log/ufw_update.log"
PORT="サーバーのSSHポート番号"
# ログファイルから最後のIPを取得
if [ -f "$LOG_FILE" ]; then
LAST_IP=$(grep "DOMAIN-IP:" $LOG_FILE | tail -1 | awk '{print $NF}')
else
LAST_IP=""
fi
# ログファイルを更新
echo "$current_time: 現在のDOMAIN-IP: $DOMAIN_IP" >> $LOG_FILE
# IPが変化したか、ログファイルが存在しないかをチェック
if [ "$DOMAIN_IP" != "$LAST_IP" ] || [ -z "$LAST_IP" ]; then
echo "$current_time: IPアドレスが変化しました。更新を実行します" >> $LOG_FILE
# UFWルールを更新
# 重複を避けるため、このポートに対するすべてのルールを削除
ufw status numbered | grep " $PORT " | cut -d "[" -f2 | cut -d "]" -f1 | tac | while read -r line ; do
yes | ufw delete $line
done
# 新しいルールを追加
ufw allow from $DOMAIN_IP to any port $PORT
ufw deny $PORT
echo "$current_time: 更新が完了しました" >> $LOG_FILE
else
echo "$current_time: IPアドレスは変化していません。更新は不要です" >> $LOG_FILE
fi
# 現在のファイアウォールの状態を表示
ufw_status=$(ufw status)
echo "$current_time: 現在のファイアウォールの状態:" >> $LOG_FILE
echo "$ufw_status" >> $LOG_FILE
echo "===============================" >> $LOG_FILE
最後に、crontab を設定して定期的にドメイン解析の IP を取得するスクリプトを実行します。
以上、お疲れ様でした🎊