ねじまきまきまき -Random Note-

やったこと忘れないための雑記

sshポート変更とかファイアウォールとか

VPSで借りてるCentOS7のセキュリティ設定あれやこれやっていう話。

とくに目新しいことをやるわけじゃないので、よくあるような設定をやっていく。

ブルートフォースって一般的よね

適当にセキュアログの最新20件とかとってみるとこんな感じ。
これだけ見ても割と頻繁にやってきているのがよくわかる。

$ sudo grep "Invalid user" /var/log/secure | tail -20
Jan 29 16:47:24 ******** sshd[21619]: Invalid user device from 142.93.185.255 port 39216
Jan 29 16:47:24 ******** sshd[21621]: Invalid user mysql from 142.93.185.255 port 39274
Jan 29 16:47:24 ******** sshd[21623]: Invalid user gpu from 142.93.185.255 port 39316
Jan 29 16:47:24 ******** sshd[21625]: Invalid user yjh from 142.93.185.255 port 39358
Jan 29 16:47:25 ******** sshd[21632]: Invalid user test from 142.93.185.255 port 39484
Jan 29 16:47:26 ******** sshd[21640]: Invalid user heliulu from 142.93.185.255 port 39658
Jan 29 16:47:26 ******** sshd[21642]: Invalid user xguest from 142.93.185.255 port 39712
Jan 29 16:47:26 ******** sshd[21647]: Invalid user hangchen from 142.93.185.255 port 39778
Jan 29 16:47:27 ******** sshd[21653]: Invalid user liuhui from 142.93.185.255 port 39904
Jan 29 16:47:27 ******** sshd[21658]: Invalid user user from 142.93.185.255 port 39994
Jan 29 16:47:27 ******** sshd[21664]: Invalid user test from 142.93.185.255 port 40118
Jan 29 16:47:27 ******** sshd[21666]: Invalid user gym from 142.93.185.255 port 40152
Jan 29 16:47:28 ******** sshd[21668]: Invalid user test from 142.93.185.255 port 40200
Jan 29 16:47:28 ******** sshd[21675]: Invalid user admin from 142.93.185.255 port 40328
Jan 29 16:47:28 ******** sshd[21677]: Invalid user wwwlogs from 142.93.185.255 port 40368
Jan 29 16:47:28 ******** sshd[21679]: Invalid user ubuntu from 142.93.185.255 port 40406
Jan 29 16:47:29 ******** sshd[21681]: Invalid user tsc_dev from 142.93.185.255 port 40444
Jan 29 16:47:29 ******** sshd[21685]: Invalid user upload from 142.93.185.255 port 40538
Jan 29 16:47:29 ******** sshd[21688]: Invalid user dmdba from 142.93.185.255 port 40572
Jan 29 16:47:29 ******** sshd[21690]: Invalid user test from 142.93.185.255 port 40624

とりあえずこいつらを防ぐためにfail2banの導入とか設定とかをやっていく。

設定項目

  • fail2ban導入
  • firewalld設定
  • sshd設定変更

fail2ban導入

インストールとか設定なんかはこの辺りを参考にただやっていく。
knowledge.sakura.ad.jp
www.khstasaba.com
qiita.com
note.classact.co.jp
CentOS7の場合、iptableじゃなくてfirewalldを使用することになるので、そこは間違えないようにとにかくポチポチ設定して起動する。

設定が終わってエラーなく起動していたらよしとする。

$ sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
   Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2021-01-29 17:54:26 JST; 9s ago
     Docs: man:fail2ban(1)
  Process: 25377 ExecStop=/usr/bin/fail2ban-client stop (code=exited, status=0/SUCCESS)
  Process: 23994 ExecReload=/usr/bin/fail2ban-client reload (code=exited, status=0/SUCCESS)
  Process: 25383 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
 Main PID: 25384 (f2b/server)
    Tasks: 7
   Memory: 10.6M
   CGroup: /system.slice/fail2ban.service
           mq25384 /usr/bin/python2 -s /usr/bin/fail2ban-server -xf start

ちなみに、fail2banのステータス確認時にWARNINGとか表示された場合は、jail設定ファイルに問題がある場合が多いので、設定を見直すこと。
たまにいろいろ変更したものが競合することもあるので、fail2banを再起動するとWARNINGが消えることもある。

fail2banでBANされた状況を確認するためにはfail2ban-clientコマンドやipsetコマンドを使用して確認することになる。
とはいえ確認するためにいちいちコマンド実行するのもめんどくさいので、こんな内容のbashを作成してサーバログイン時とか状況を見たいときに確認するようにしている。

geoiplookupはこんなコマンド。
techracho.bpsinc.jp

現在はGeoIPの最新のDBファイルは、アカウントを作成しないと取得できないようになっている。
とはいえ、ある程度見れればいいのでそのままにしている。

#!/usr/bin/bash
sudo fail2ban-client status sshd
echo "------------------------------------------"
sudo ipset --list
echo "------------------------------------------"
for i in `sudo ipset --list | egrep "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | awk '{print $1}'`
do
    printf "%s : %s\n" "$i" "`geoiplookup $i`"
done

このbashの実行結果としてはこんな感じ
使用している環境はfail2banのBANタイムを変更していたりするのでタイムアウトが長い。
fail2ban-clientでBANされていて、ipsetにその内容が反映されていることがわかるので見たい内容としては十分。
geoipの結果はさきに書いた通り、あくまでも参考。

$ /Local/fail2ban_check.bash
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     615
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 5
   |- Total banned:     5
   `- Banned IP list:   178.128.59.188 159.65.13.76 111.14.216.210 142.93.185.255 216.222.148.196
------------------------------------------
Name: f2b-sshd
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 timeout 604800
Size in memory: 600
References: 2
Number of entries: 5
Members:
111.14.216.210 timeout 602958
159.65.13.76 timeout 602958
142.93.185.255 timeout 602958
216.222.148.196 timeout 602958
178.128.59.188 timeout 602958
------------------------------------------
111.14.216.210 : GeoIP Country Edition: CN, China
159.65.13.76 : GeoIP Country Edition: SG, Singapore
142.93.185.255 : GeoIP Country Edition: CA, Canada
216.222.148.196 : GeoIP Country Edition: US, United States
178.128.59.188 : GeoIP Country Edition: GR, Greece

firewalld設定

CentOS7のファイアウォール機能はiptableからfirewalldに変更になっているので、そっちの機能追加
sshdのポート変更をやるならそれを見越しつつ、使用するポートの穴あけを行うように参考を見つつ設定を行う。
qiita.com

sshd設定変更

sshdの設定変更としては、こんな感じのことを実施する。

  • rootの直接ログイン不可
  • パスワード認証を不可、鍵認証のみ許可
  • sshポート変更
rootの直接ログイン不可/パスワード認証を不可、鍵認証のみを許可

sshdのconfig編集と再起動がともに必要なので、とりあえずこのあたりを見て設定。
鍵の作成とかサーバ配置に使用方法もとりあえず参考を見つつ設定。
qiita.com

sshポート変更

これも参考を見つつ設定するだけ。
qiita.com

おまけ

パケットフィルタ

サービスによってはパケットフィルタによる穴あけもできるので、使用している場合はそっちの設定変更もしないとダメ。
firewalldを使っているならパケットフィルタをわざわざ使う必要はない気もするけどね。

SiteGuard

さくらVPSはWeb Application FirewallのSiteGuardが使えるみたいなので、こっちを使ってもいいかもね。
というか、ブルートフォースを防ぐにはこっちのほうが有効な気がする。

さくらVPSでIRC ProxyとWebクライアント立てた

■始まりは気まぐれ、だけどブルースクリーン

もう半年以上前だけど、デスクトップPC(Windows)を疑似サーバにしてたIRC ProxyなんかをVPS側に全部持って行った。
そうしたら、デスクトップPCが恒例のWindows Updateブルースクリーンだしたので、役割終わったとでも思ったのか…。
おかげでゲームができなくなったんだぞ……。

VPSさくらインターネットのさくらVPSにした

vps.sakura.ad.jp
プランとしてはIRC ProxyとWebClientさえ動けばいいので、一番安いプラン(512M 石狩ゾーン)で、OSはCentOS7を選択。

■使ってたのは、tiarraとkeitairc

tiarraもkeitaircもperlだし、keitaircに至っては無理やりWindowsで動かしていたぐらいだから、CentOSとかのLinuxで動かすのはむしろ簡単。

■OS作業

セットアップしたときのOS情報はこんな感じ。
アップデートコマンドは実行しているから、変わっているかも。

$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

作業ユーザはroot以外のユーザを作って、そっちのほうでポチポチやる。
当たり前だけどマウントポイントは最低限なので、適当にルート領域にディレクトリを作成していく。
とりあえずのディスク情報はこんな感じ。

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         234M     0  234M    0% /dev
tmpfs            244M     0  244M    0% /dev/shm
tmpfs            244M   29M  215M   12% /run
tmpfs            244M     0  244M    0% /sys/fs/cgroup
/dev/vda4         21G  5.6G   14G   29% /
/dev/vda2        477M  226M  222M   51% /boot
tmpfs             49M     0   49M    0% /run/user/1000
■セットアップと確認

tiarraとkeitaircのセットアップは2つともマニュアルを読んで実施。
それぞれのconfigファイルはVPSへの移行にあたってポート番号とかちょっと見直し。
ひとまず起動してみて、ファイアウォールとかポートマッピングの設定がちゃんと狙い通り行けているかどうかを見てみる。
keitaircをPCブラウザで開いて画面が帰ってくればOK。
画面レイアウト崩れている気がするけど、PCからは使わないから気にしない。
 f:id:neji_shiki:20210125150012p:plain

自動起動設定

tiarraとkeitaircはOS起動時に動いてくれるようにしたいので、cronにそのことを書く。

@reboot /Local/xxxx/tiarra_run.bash 1>/dev/null 2>&1 &
@reboot /Local/xxxx/keitairc_run.bash 1>/dev/null 2>&1 &

見てもらうとわかる通り、tiarraとkeitairc自体はそれぞれ起動用のbashファイルを作って、その中から呼び出している。
というのもそれぞれdaemon化するには引数を使ったり、環境変数を切ったり起動タイミングをずらしたりといったことが必要なので、そこを調整するために、それぞれの起動シェルを用意している。
起動シェル自体をバックグラウンドプロセスにしているけど、シェル内でそれぞれのプロセスをバックグラウンドに投げているので、これは不要だったりもする。

ちなみにこの場合、bashはログインシェルとして動作させないとプロセスの常駐化に失敗するので、Shebangにオプションを指定してあげないといけない。

  • lオプションでログインシェルとしての動作となるので、必要な環境変数の読み込みとかやってくれる。
#!/bin/bash -l

この状態でOSリブートをしてみて、狙い通りにtiarraとkeitaircが起動してくれることまで確認して、とりあえず終わり。

■おまけ

ちなみに接続URLの問題があるので、DDNS通知用のシェルもcronに登録していて、これは数分毎に動作するようになっている。
めんどくさくなってサンプル通りに動かしているから、これは特筆することはなにもない。
しいて言えば、Windowsで動かしていたDDNS通知用のpythonスクリプトがそのままでは動かない感じになったから、もういいやって思ったぐらい。