root / plugins / ssh / hostdenied @ 17f78427
Historique | Voir | Annoter | Télécharger (4,32 ko)
| 1 |
#!/bin/bash |
|---|---|
| 2 |
# |
| 3 |
# Plugin to monitor the number of hosts in /etc/hosts.deny |
| 4 |
# that are denied access to sshd |
| 5 |
|
| 6 |
# Copyright (C) 2010 Lothar Schmidt, l.munin@scarydevilmonastery.net |
| 7 |
# Bushmills on #munin, irc.freenode.net |
| 8 |
# latest versions on http://scarydevilmonastery.net/munin.cgi |
| 9 |
# |
| 10 |
# This program is free software: you can redistribute it and/or modify |
| 11 |
# it under the terms of the GNU General Public License as published by |
| 12 |
# the Free Software Foundation, either version 3 of the License, or |
| 13 |
# (at your option) any later version. |
| 14 |
# |
| 15 |
# This program is distributed in the hope that it will be useful, |
| 16 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 |
# GNU General Public License for more details. |
| 19 |
# |
| 20 |
# You should have received a copy of the GNU General Public License |
| 21 |
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 22 |
# |
| 23 |
# ------------------------------------------------------------------------------------------------------ |
| 24 |
# 20100310 v1.01 ls |
| 25 |
# as threatened, shows now "temperatures" of active hosts.deny lines. Recent additions are |
| 26 |
# displayed in bright red, turning to blue as older the addition rules are. |
| 27 |
# This requires denyhosts to add line to hosts.deny in a specific format. Also, times are currently |
| 28 |
# hardcoded, and not a lot of flexibility adjusting them through parameters. |
| 29 |
# A line in hosts.deny should come with a comment, looking like: |
| 30 |
# # DenyHosts: Sat Mar 6 01:11:57 2010 | sshd: 87.101.51.198 |
| 31 |
# 8 graphs are drawn from that depicting number of rules in 24 h increments. Different colours are |
| 32 |
# assigned to graphs which are <24h, 24-48h, 48-72h ... old. The last (coldest) graph shows rules |
| 33 |
# which have been added > 168h ago. |
| 34 |
# I'm considerering to change age granularity to hours, rather than days, and plot many graphs (64 or 128, |
| 35 |
# which are nice for colour calculations), showing more of a colour cloud than discernible areas. |
| 36 |
# The plugin must have permission to read /etc/hosts.deny, of course. |
| 37 |
# 20100308, v1.0, ls |
| 38 |
# Will probably add multiple stacked graphs, indicative for addition/removal date of denies, |
| 39 |
# instead of a boring single area graph. |
| 40 |
# ------------------------------------------------------------------------------------------------------ |
| 41 |
|
| 42 |
#%# family=manual |
| 43 |
#%# capabilities=autoconf |
| 44 |
|
| 45 |
# ------------------------------------------------------------------------------------------------------ |
| 46 |
DENY="/etc/hosts.deny" |
| 47 |
NAME="$(basename $0)" # component of naming temporary files |
| 48 |
STATEFILE="$MUNIN_PLUGSTATE/$NAME.state" |
| 49 |
COLOUR=(FF0000 DA0024 B60048 91006D 6D0091 4800B6 2400DA 0000FF) # hot to cold colours |
| 50 |
# ------------------------------------------------------------------------------------------------------ |
| 51 |
|
| 52 |
run_autoconf() {
|
| 53 |
RUN="no" |
| 54 |
which grep denyhosts basename > /dev/null && RUN="yes" # only run when grep and denyhost are present |
| 55 |
echo "$RUN" |
| 56 |
} |
| 57 |
|
| 58 |
|
| 59 |
run_config() {
|
| 60 |
cat << EOF |
| 61 |
graph_title denied sshd access in $DENY |
| 62 |
graph_args --base 1000 -l 0 |
| 63 |
graph_vlabel Hosts denied |
| 64 |
graph_category security |
| 65 |
age0.label added last 24h |
| 66 |
age0.draw AREA |
| 67 |
age0.colour ${COLOUR[0]}
|
| 68 |
EOF |
| 69 |
for AGE in {1..7}; do
|
| 70 |
cat << EOF |
| 71 |
age${AGE}.label older than $((AGE*24))h
|
| 72 |
age${AGE}.draw STACK
|
| 73 |
age${AGE}.colour ${COLOUR[$AGE]}
|
| 74 |
EOF |
| 75 |
done |
| 76 |
} |
| 77 |
|
| 78 |
|
| 79 |
run_fetch() {
|
| 80 |
TOTAL=0 |
| 81 |
NOW=$(date +%s) |
| 82 |
sed -n 's/^\# DenyHosts: //;s/ | .*//gp' $DENY | # strip all but date |
| 83 |
while read DATE; do |
| 84 |
echo $(((NOW - $(date -d "$DATE" +%s))/86400)) # calculate rule age |
| 85 |
done > $STATEFILE # rather than going through temp file, the age could be |
| 86 |
for AGE in {0..6} ; do # used to increment an array element with that index.
|
| 87 |
COUNT="$(grep -c "^$AGE$" $STATEFILE)" # That'd save grepping for counting from temp file. |
| 88 |
echo "age${AGE}.value $COUNT" # produce values for all but oldest
|
| 89 |
((TOTAL+=COUNT)) |
| 90 |
done |
| 91 |
echo "age7.value $(($(grep -c . $STATEFILE)-TOTAL))" # all non-printed are older |
| 92 |
rm $STATEFILE |
| 93 |
} |
| 94 |
|
| 95 |
run_${1:-"fetch"}
|
| 96 |
exit 0 |
