---
title: "sshguardでsshを守る | grasys blog"
url: "https://blog.grasys.io/post/yusukeh/sshguard_gcp/"
description: "こんにちワン！grasysの長谷gaワン！です。 わんわん言ってますが、最近ニャンちゅうって言われ始めてますｗ sshguard sshd用のブルートフォースアタック対策ツールです。 grasysではsshguardを要件次第で活用しています。 こちらではsshguardを gcloud コマンドを交えて自動設定して…"
---

# sshguardでsshを守る

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[yusukeh](/authors/yusukeh/)
-   公開日：2016年8月30日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#セキュリティ](/tags/セキュリティ/)[#Compute Engine](/tags/compute-engine/)[#ssh](/tags/ssh/)[#sshguard](/tags/sshguard/)

![sshguardでsshを守る](/_astro/ogp.BCVkA-du_ZRdfex.webp)

こんにちワン！grasysの長谷gaワン！です。  
わんわん言ってますが、最近ニャンちゅうって言われ始めてますｗ

[sshguard](http://www.sshguard.net/)  
sshd用のブルートフォースアタック対策ツールです。

grasysではsshguardを要件次第で活用しています。  
こちらではsshguardを**gcloud**コマンドを交えて自動設定してみようかなと！

1番安全なのはIP制限をGoogle Cloud (GCP) Compute Engine Firewallでかけて閉じることなんですが  
お客様の環境やワークスタイル次第では  
sshは開けて欲しいけどセキュリティがががが・・・  
みたいな要望もあったので取り急ぎアタックを制御することで 以下の形で選んで貰うようにしています。

**前提条件: opsというインスタンスを必ず作るようにしてますがopsのみssh許可**

1.  sshguard + Firewall公開
2.  FirewallでIP制限

_移動が多いお客さんもいるしね_

## 実際アタックがどれくらい多いか

以下ちょっと1週間放置したsshのlogin失敗のlog

Plain textcontent\_copy

```
grep "input_userauth_request: invalid user" /var/log/secure* | awk '{print $9}' | sort | uniq -c

      1 1
      2 1234
      1 ~1EaseUs@AcsT
      1 500
      3 a
      1 aaron
      3 adam
      1 adempiere
      3 adilson
    675 admin
      1 ADMIN
      1 Administrateur
      3 administrator
      5 Administrator
      3 aktainfo
      1 alan
~~~~~~~~中略~~~~~~~~
      1 www
      1 wwwroot
      1 xbian
      1 xbmc
      1 z
      2 zabbix
      1 zhangchuanzhuo
      2 zzadmin
```

-   1ってユーザなんなんだよ
-   1234ってユーザなんなんだよ
-   zabbixは許す、、、zってユーザが許せん！
-   全体的に1文字ユーザ許せん！ふざけんな！w

wcしてみる

Plain textcontent\_copy

```
grep "input_userauth_request: invalid user" /var/log/secure* | wc -l

1521
```

おおい・・・ｗ

## Compute EngineのFirewall Rule default設定

これで確認できます。

`gcloud compute firewall-rules describe default-allow-ssh`

Plain textcontent\_copy

```
allowed:
- IPProtocol: tcp
  ports:
  - '22'
creationTimestamp: '2014-11-10T20:58:42.327-08:00'
description: Allow SSH from anywhere
id: 'xxxxxxxxxxxxxxxxxxx'
kind: compute#firewall
name: default-allow-ssh
network: https://www.googleapis.com/compute/v1/projects/xxxxx-xxxxxxx-xxx/global/networks/default
selfLink: https://www.googleapis.com/compute/v1/projects/xxxxx-xxxxxxx-xxx/global/firewalls/default-allow-ssh
sourceRanges:
- 0.0.0.0/0
```

Project作ってCompute Engineを有効化した直後はデフォルトだと基本sourceRangesで`0.0.0.0/0`が設定されていて公開になってます。

これを設定変更して所定のIPのみにしたりして制御します。

_Project作った時期によっても多少違うかも_

## Install sshguard

まずgcc入れましょう  
入ってたら飛ばして！

CentOS6向けです（CentOS7でもやれてるから多分動くと思うけど・・・）

Plain textcontent\_copy

```
yum -y install gcc
```

### build sshguard

最新版でいきたい！オレは常に最新版がいい！ｗ  
たぶん動く！動かなかったら手でゴニョゴニョしてください！

1.  ゴニョゴニョ変数準備
2.  sshguardのtarballをダウンロード
3.  tarball 展開
4.  configure
5.  make && make install
6.  symlink

`/opt/`配下にInstallします。

Plain textcontent\_copy

```
version=1.7.0
module=sshguard
name=${module}-${version}

build_base=/tmp/src/
build_dir=/tmp/src/${name}
deploy_to=/opt/${name}
symlink_to=/opt/${module}

download_url=http://downloads.sourceforge.net/project/${module}/${module}/${version}/${name}.tar.gz
download_to=/tmp/src/${name}.tar.gz

curl --create-dirs -o ${download_to} -L ${download_url}
tar -xvzf ${download_to} -C ${build_base}
cd ${build_dir}
./configure \
  --prefix=${deploy_to} \
  --with-firewall=iptables
make
make install

ln -sf ${deploy_to} ${symlink_to}
```

これやったら多分入ったと思うんで  
おもむろに以下を叩くとヘルプが見れます！

Plain textcontent\_copy

```
/opt/sshguard/sbin/sshguard -h
usage: sshguard [-v] [-a thresh] [-b thresh:file] [-e script]
       		[-f service:pid-file] [-i pidfile] [-l source] [-p interval]
       		[-s interval] [-w address | file]
```

### whitelistを作る!

sshguardにはwhitelist機能があるので一応活用します。

せっかくなんでGoogle Cloud (GCP) Platform Compute EngineのInternalをwhitelistに登録します。

1.  metadataに自分のインスタンスのネットワークを聞きに行く
2.  network名でnetworkの[x\_gcloud\_mode](https://cloud.google.com/compute/docs/subnetworks)を調べる
3.  Network Rangeを取得
4.  `/tmp/sshguard_whitelist`に出力（`/tmp`配下なのに意味はとくにありません！）

Plain textcontent\_copy

```
network=`curl -s -H "Metadata-Flavor: Google" metadata/computeMetadata/v1/instance/network-interfaces/0/network | xargs basename`
x_gcloud_mode=`gcloud compute networks describe ${network} | grep x_gcloud_mode | awk '{print $2}'`
if [ ${x_gcloud_mode} = "legacy" ]; then
  IPv4Range=`gcloud compute networks describe ${network} | grep IPv4Range | awk '{print $2}'`
elif [ ${x_gcloud_mode} = "auto" -o ${x_gcloud_mode} = "custom" ]; then
  IPv4Range=()
  for t in `gcloud compute networks subnets list | grep -v NAME | grep ${network} | awk '{print $4}'`
  do
    IPv4Range+=("${t}")
  done
else
  echo "gcloud components updateしましょう！"
  exit 1
fi

test -f /tmp/sshguard_whitelist && rm -rf /tmp/sshguard_whitelist
for r in ${IPv4Range[@]}
do
  echo ${r} >> /tmp/sshguard_whitelist
done
```

できあがったwhitelistは以下で確認できます。

Plain textcontent\_copy

```
cat /tmp/sshguard_whitelist
```

[sshguard WHITELISTING](http://www.sshguard.net/docs/whitelist/)

* * *

x\_gcloud\_modeは[Using Subnetworks](https://cloud.google.com/compute/docs/subnetworks)ここをみるとわかるんだけど  
2016年08月30日現在のところ3種類

-   legacy
-   auto
-   custom

いつのまにかに・・・ｗ

### iptables

sshguardはiptablesを利用します。  
以下のコマンドでchainを作成して下さい。

Plain textcontent\_copy

```
iptables -N sshguard
iptables -A INPUT -m multiport -p tcp --destination-ports 22 -j sshguard
```

[sshguard SETUP NETFILTER/IPTABLES](http://www.sshguard.net/docs/setup/#netfilter-iptables)

### Init sshguard

| option | description |
| --- | --- |
| -a | 閾値 |
| -p | 閾値を超えたIPをここで設定した秒数 iptablesでフィルタリングする |
| -s | 閾値を超えたIPを開放する秒数 |

Plain textcontent\_copy

```
thresh=50
p_interval=420
s_interval=1200
/opt/sshguard/sbin/sshguard \
  -a ${thresh} \
  -p ${p_interval} \
  -s ${s_interval} \
  -l /var/log/secure \
  -i /var/run/sshguard.pid \
  -w /tmp/sshguard_whitelist
```

threshを30にすると3回でsshguardがiptablesにフィルターしちゃうので  
`gcloud compute ssh`するときに困りますｗ

5回の50くらいがいいかも・・・

## sshguardのフィルター確認

以下とある環境の出力

Plain textcontent\_copy

```
iptables -L -n
```

![sshguardのフィルター確認の画面](/_astro/01-sshguard_iptables-12791506.YCqXI7d__ZrFiWv.webp)

なんで気を使ってIPにモザイクかけてるかわからんけど・・・

### iptablesのお掃除

sshguardは登録する機能しか持っていないので  
iptablesにchainは残ります。

邪魔なら以下で消えるのでどうぞ

Plain textcontent\_copy

```
for sshguard_num in `iptables -L INPUT --line-numbers | grep sshguard | awk '{print $1}'`
do
  iptables -D INPUT ${sshguard_num}
done
iptables -X sshguard
```

## grasysでは

こんなのつどつどでもやってられないので  
bashのCommand Line Framework [rerun](https://github.com/rerun/rerun)を利用して 1 commandで諸々設定できるようになってます。

こんな感じ

Plain textcontent\_copy

```
rerun security: sshguard
```

## この記事を書いた人

[![](/_astro/yusukeh.BvUd2yKE_1mQ6Fp.webp)](/authors/yusukeh/)

### [yusukeh](/authors/yusukeh/)

Fly high. Think deep. Move fast. Go far.🦅

-   [X](https://x.com/yusukeh "X")
-   [GitHub](https://github.com/yusukeh "GitHub")
-   [Medium](https://medium.com/@yusukeh "Medium")
-   [Facebook](https://www.facebook.com/yusuke.exzm "Facebook")
-   [Instagram](https://www.instagram.com/yusukehasegawa/ "Instagram")
-   [LinkedIn](https://www.linkedin.com/in/hasegawa-yusuke-091b4164/ "LinkedIn")

[プロフィールと記事一覧](/authors/yusukeh/)
