Logwatch
Logwatch は、いろいろなログをまとめて集計し、レポートとして毎日定期的にメールで届けてくれる。不正アクセスや不具合の発見とサーバの監視に便利なツール。
①インストール
|
1 |
# apt -y install logwatch |
②デフォルトの設定ファイルをコピー
|
1 |
# cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/ |
➂メールの送信先等を変更
|
1 2 3 4 5 6 7 8 9 |
# vi /etc/logwatch/conf/logwatch.conf 52 行目 : コメントにして、その下に通知を受け取りたいメールアドレスを追加 #MailTo = root MailTo = [メールアドレス] 85行目 : ログ通知の詳細度を設定 #Detail = Low Detail = High |
④ディレクトリの作成
|
1 |
# mkdir /var/cache/logwatch |
⑤動作確認
logwatch をインストールするとデフォルトで cron 登録されるので、毎日レポートメールが届く
設定したアドレスにレポートが届くかテストを行います。
|
1 |
# /etc/cron.daily/00logwatch |
Chkrootkit
chkrootkitはルートキットの存在を検知するためのツール。
なお、chkrootkitは既に改ざんされた後では意味がないため、導入時には考慮が必要です。また、chkrootkitはrootkitを検出しても自動的に対処する機能はないため、検出後は手動で対応する必要があります。
①chkrootkit をインストール
|
1 |
# apt -y install chkrootkit |
➁chkrootkit を確認
|
1 2 |
# chkrootkit | grep INFECTED 何も表示されなければ問題ありません |
④chkrootkit 定期実行スクリプトの作成と権限変更
自動で /usr/sbin/chkrootkit-dailyをもとに/etc/cron.daily/chkrtootkit が作成され、毎日自動で実行されるので、スクリプトの作成は不要。
これで、rootkit が仕掛けられていた場合に root 宛にメールが届くようになる。
ディスク使用率チェックスクリプト
1. スクリプト作成
|
1 2 |
# cd /opt/script/ # vi disk_capacity_check.sh |
disk_capacity_check.shの内容
|
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash #通知先メールアドレス指定 MAIL="<your mailaddress>" DVAL=`/bin/df / | /usr/bin/tail -1 | /bin/sed 's/^.* \([0-9]*\)%.*$/\1/'` if [ $DVAL -gt 80 ]; then echo "Disk usage alert: $DVAL %" | mail -s "Disk Space Alert in `hostname`" $MAIL fi |
|
1 |
# chmod 700 disk_capacity_check.sh |
2. 実行確認
①現在の使用率を確認
|
1 |
# df -h |
次のように表示される
|
1 2 3 4 5 6 7 |
Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 389M 772K 388M 1% /run /dev/sda1 19G 2.9G 15G 17% / tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 389M 0 389M 0% /run/user/1000 |
②使用率80%以上になるようダミーファイルを作成(例ではdummyfile という名前で14G程度)
|
1 |
# dd if=/dev/zero of=dummyfile bs=1M count=14000 |
③再度確認
|
1 |
# df -h |
を実行して80%以上になっていることを確認
④ディスク容量チェックスクリプトを実行
|
1 |
# /opt/script/disk_capacity_check.sh |
設定したメールアドレスに本文の内容として「Disk usage alert : 94%」のように記載のメールが届きます
⑤作成した「dummyfile」を削除
|
1 |
# rm dummyfile |
⑥定期実行設定
|
1 2 |
# crontab -e 30 2 * * * /opt/script/disk_capacity_check.sh |
DNS更新
ネットが切断されたり、ルーターが切断再起動したときにおこるグローバルIPの変更の度に、ダイナミックDNSにアクセスしグローバルIPが変更されたことを知らせなくてはいけません。
専用のpythonファイルを作成しCronで定期実行します
今回はValudomainでのDNS設定です
|
1 2 |
# cd /opt/script # vi ddnsset.py |
ddnsset.pyの内容
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#setddns.py import requests import ipaddress from datetime import datetime from pathlib import Path # SETTING DATA MY_DOMAIN = "example.jp" ←自ドメイン MY_PASS = "xxxxxxxxxx" ←パスワード MY_HOSTNAME = "xxxx" ←ホスト名 OUT_FILE = Path("/tmp/ipadress") ←IPアドレス記録ファイル def time_msg(): now = datetime.now() return now.strftime("%Y/%m/%d %H:%M:%S") def is_valid_ip(ip_str): try: ipaddress.ip_address(ip_str) return True except ValueError: return False def main(): # Check Global IP Address url_get_ip = "https://dyn.value-domain.com/cgi-bin/dyn.fcg?ip" try: response = requests.get(url_get_ip, timeout=10) response.raise_for_status() current_ip = response.text.strip() except requests.RequestException as e: print(f"{time_msg()} Failed to get IP: {e}") return # IP check mssg = time_msg() if not current_ip: print(f"{mssg} invalid IP NULL") return if not is_valid_ip(current_ip): print(f"{mssg} invalid IP={current_ip}") return # Read previous IP previous_ip = "" if OUT_FILE.exists(): with open(OUT_FILE, "r") as f: previous_ip = f.read().strip() if current_ip == previous_ip: print(f"{time_msg()} no change IP={current_ip}") return else: print(f"change IP from {previous_ip} to {current_ip}") # Update DDNS mssg = time_msg() print(f"{mssg} access to value-domain") url_set_ddns = ( f"https://dyn.value-domain.com/cgi-bin/dyn.fcg?" f"d={MY_DOMAIN}&p={MY_PASS}&h={MY_HOSTNAME}" ) try: response = requests.get(url_set_ddns, timeout=10) response.raise_for_status() # 改行をスペースに変換し、連続するスペースを1つにまとめる result = ' '.join(response.text.strip().split()) except requests.RequestException as e: print(f"{time_msg()} Failed to update DDNS: {e}") return mssg = time_msg() print(f"{mssg} {MY_HOSTNAME}.{MY_DOMAIN} {result} IP={current_ip}") # DDNS更新が成功した場合のみIPを保存 if "status=0" in result: with open(OUT_FILE, "w") as f: f.write(current_ip) print(f"{mssg} Successfully saved new IP: {current_ip}") else: print(f"{mssg} DDNS update failed, IP not saved") if __name__ == "__main__": main() |
IPアドレス記録ファイル作成
|
1 |
# touch /tmp/ipadress |
定期的に実行
|
1 2 3 |
# crontab -e * 00 * * * /usr/bin/python3 /var/www/system/ddnsset.py >> /var/log/ddns_updater.log 2>&1 |
