banner
Aki

Aki

太阳能维修,月亮可更换,星星不闪包退换。
twitter

安全にバッシュ

公開サーバーの 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 スクリプトを使用して動的なアクセス元の制限を実現する必要があります。原理は以下の図の通りです👇:

image

まず、ドメインを購入する必要があります。無料のものでも構いません。一般的な 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 を取得するスクリプトを実行します。

以上、お疲れ様でした🎊

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。