だいぶ前に sshguardでブルートフォースアタック対策 という記事を書きましたが、最近CentOS7で環境を作りなおしていることもあり、最新バージョンのパッケージがなかったので自作してみました。
どこにでもありそうな内容ですし、別にCentOS”7″だからという部分もほぼないのですが──主にRPMパッケージの作成手順を目的として、sshguardパッケージの作成をまとめていきたいと思います。
RPM作成用パッケージ
インストールします。
1 |
yum install rpm-build rpmdevtools make gcc |
sshguardのソースを用意
一般ユーザーで作業ディレクトリを準備します。
1 2 3 4 5 6 7 8 9 |
$ su - centos $ rpmdev-setuptree $ tree rpmbuild/ rpmbuild/ ├── BUILD ├── RPMS ├── SOURCES ├── SPECS └── SRPMS |
ソースをゲットして解凍します。少し編集するので、仮で .orig をつけています。
1 2 3 |
cd rpmbuild/SOURCES/ wget -O sshguard-1.6.3.tar.gz.orig "$DIRECT_LINK" tar xzf sshguard-1.6.3.tar.gz.orig |
今回は少しだけ手を入れます。起動時に大量、その後も毎秒一行のログが出てウザ過ぎて、止める手立てがなさそうだったので、しょうがなくです。
(※syslog側で破棄するより元を絶ちたかったので)
微量のパッチですが作成して、
1 2 3 4 5 6 7 8 9 10 11 12 |
--- sshguard-1.6.3_orig/src/sshguard_logsuck.c 2016-02-16 06:01:16.229017622 +0000 +++ sshguard-1.6.3/src/sshguard_logsuck.c 2016-02-16 06:02:41.989876748 +0000 @@ -286,7 +286,9 @@ } list_iterator_stop(& sources_list); - sshguard_log(LOG_INFO, "Refreshing sources showed %u changes.", numchanged); + if ( numchanged > 0 ) { + sshguard_log(LOG_INFO, "Refreshing sources showed %u changes.", numchanged); + } return 0; } |
パッチを当てて、また固めます。
1 2 3 |
patch -p0 < sshguard.patch tar czf sshguard-1.6.3.tar.gz sshguard-1.6.3 rm -Rf sshguard-1.6.3 |
追加ファイルの作成
ソースアーカイブ内に存在しないファイルを作成しておきます。作成場所は、引き続き SOURCES 配下です。systemdのユニットファイル
1.6.3 から examples/sshguard.service が追加されたので、それを流用して好みに仕上げます。内容は主にこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# sshguard.service -- sample systemd unit file [Unit] Description=Intelligently block brute-force attacks by aggregating system logs After=syslog.target After=iptables.target After=ip6tables.target After=libvirtd.service After=firewalld.service [Service] EnvironmentFile=/etc/sysconfig/sshguard ExecStartPre=-/usr/sbin/iptables -N sshguard ExecStartPre=-/usr/sbin/iptables -I INPUT -p tcp -m multiport --dports "$PORTS" -j sshguard ExecStart=/usr/sbin/sshguard -l "$LOGFILE" -w "$WHITELIST" -b "$BLACKLIST" $OPTIONS ExecStopPost=-/usr/sbin/iptables -D INPUT -p tcp -m multiport --dports "$PORTS" -j sshguard ExecStopPost=-/usr/sbin/iptables -X sshguard Restart=always [Install] WantedBy=multi-user.target |
sysconfigでデフォルト環境変数を設定
/etc/sysconfig/sshguard のファイルを作成します。
1 2 3 4 5 |
OPTIONS="-a 50 -p 420 -s 1200" PORTS="22,10022,20022" LOGFILE="/var/log/secure" WHITELIST="/etc/sshguard/whitelist" BLACKLIST="60:/var/db/sshguard/blacklist.db" |
ホワイトリスト
ほぼexamplesそのままですが、/etc/sshguard/ に置いて利用します。
1 2 3 4 5 6 7 8 |
# comment line (a '#' as very first character) # a single IPv4 and IPv6 address 1.2.3.4 2001:0db8:85a3:08d3:1319:8a2e:0370:7344 # address blocks in CIDR notation 127.0.0.0/8 # hostnames exapmle.com |
SPECファイルの作成
RPM作成のためのSPECレシピを書きます。本家の古いRPMから持ってきて、少し書き換えた感じです。昔と比べて、追加したファイルは %files に書かないとエラーが出る、といったバージョンの違いがあるようです。
1 |
cd ~/rpmbuild/SPECS |
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 |
Name: sshguard Version: 1.6.3 Release: 1 License: GPLv2+ Summary: Protect hosts from brute force attacks against ssh Url: http://www.sshguard.net Group: Productivity/Networking/Security Source0: http://downloads.sourceforge.net/sshguard/%{name}-%{version}.tar.gz Source1: sshguard.service Source2: sshguard.sysconfig Source3: sshguard.whitelist Requires: iptables Requires: openssh-server BuildRoot: %{_tmppath}/%{name}-%{version}-build %description Sshguard protects networked hosts from brute force attacks against ssh servers. It detects such attacks and blocks the attacker's address with a firewall rule. %prep %setup -q %build %{configure} --with-firewall=iptables make %{?_smp_mflags} RPM_OPT_FLAGS="$RPM_OPT_FLAGS" %install %makeinstall mkdir -p %{buildroot}/etc/sshguard mkdir -p %{buildroot}/var/db/sshguard install -D -m 644 %{SOURCE1} %{buildroot}/usr/lib/systemd/system/sshguard.service install -D -m 644 %{SOURCE2} %{buildroot}/etc/sysconfig/sshguard install -D -m 644 %{SOURCE3} %{buildroot}/etc/sshguard/whitelist %clean rm -rf %{buildroot} %post if [ $1 -eq 1 ] ; then # Initial installation /bin/systemctl daemon-reload >/dev/null 2>&1 || : fi %preun if [ $1 -eq 0 ] ; then # Package removal, not upgrade /bin/systemctl --no-reload disable sshguard.service > /dev/null 2>&1 || : /bin/systemctl stop sshguard.service > /dev/null 2>&1 || : fi %postun /bin/systemctl daemon-reload >/dev/null 2>&1 || : if [ $1 -ge 1 ] ; then # Package upgrade, not uninstall /bin/systemctl try-restart sshguard.service >/dev/null 2>&1 || : fi %files %defattr(-,root,root,-) %doc ChangeLog examples/ %{_sbindir}/* %doc %{_mandir}/man8/%{name}* /usr/lib/systemd/system/sshguard.service /etc/sysconfig/sshguard /etc/sshguard/whitelist /var/db/sshguard %changelog |
RPM作成
一通りファイルが揃ったら、作成を実行します。
1 |
rpmbuild -ba sshguard.spec |
エラーが出たら、ひたすらSPECファイルを編集して再実行します。成功したら、RPMファイルの確認をします。
1 2 |
cd ~/rpmbuild/RPMS/x86_64/ ls -l sshguard-1.6.3-1.x86_64.rpm |
インストール前に中身を確認したい場合は、こんな感じ。
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 |
$ mkdir TEST && cd $_ $ rpm2cpio ../sshguard-1.6.3-1.x86_64.rpm | cpio -id $ tree . ├── etc │ ├── sshguard │ │ └── whitelist │ └── sysconfig │ └── sshguard ├── usr │ ├── lib │ │ └── systemd │ │ └── system │ │ └── sshguard.service │ ├── sbin │ │ └── sshguard │ └── share │ ├── doc │ │ └── sshguard-1.6.3 │ │ ├── ChangeLog │ │ └── examples │ │ ├── event_programs │ │ │ ├── email_notify.sh │ │ │ └── template.sh │ │ ├── sshguard.service │ │ └── whitelistfile.example │ └── man │ └── man8 │ └── sshguard.8.gz └── var └── db └── sshguard $ cd ../ && rm -R TEST |
実際にインストールして、
1 |
sudo yum install sshguard-1.6.3-1.x86_64.rpm |
入ったのを確認したり、
1 2 |
yum list installed | grep sshguard rpm -ql sshguard |
起動してプロセスや諸情報を確認したり、
1 2 3 |
sudo systemctl start sshguard systemctl status sshguard sudo iptables -L -v -n |
このデーモンに必要な動作確認──今回の場合は外部からわざとSSHログインに数回失敗して、iptablesで遮断されるまで確認します。
最後に、パッケージを削除して綺麗になるところまで確認して完了です。今回のだと、/etc/sshguard/ とか消すのサボってますけど、場合によってはゴミは完全に掃除したほうがよいですね。
1 2 3 |
sudo yum erase sshguard rpm -ql sshguard ps ww -C sshguard |
その他
SPECのトラブル例
SPECファイルの、例えば %preun 部の記述をミスると、アンインストール時にスクリプトエラーが出てパッケージ自体の削除ができなくなったりします。yum では強制アンインストール的なものはないので、そういう場合は rpm を使います。
1 |
rpm -e sshguard --noscripts |
.rpm を作ったら、あとは自前のyumリポジトリサーバーに置くなり、プロビジョニング・ツールの files としてぶち込むなり、都合に合わせて管理したらよいと思います。
.rpm はSPECだけで済むので、Debian系の .deb で多くの設定ファイルが必要なのに比べて、だいぶ扱いやすい印象です。最近はどのミドルウェアも迅速にパッケージを用意してくれるので、作成の機会はだいぶ減りましたが、まれに必要になるため、そういう時はヤンチャして直にコンパイルからぶち込んだりしないで、ちゃんとパッケージを作って運用しましょう、そうしましょう。