ラベル

Server (108) work (77) Idea (68) Car (31) PC (29) DAW (28) other (19) MakingWEBsite (18) 趣味 (18) health (13) CentOS (11) drupal (11) (9) android (4) スマホ (4) communication (3) drupal7 (3) hint (3) meno (3) モバイル (3) 歯医者 (3) 第二種電気工事士 (3) 英語 (3) PC Server (2) drupal8 (2) ms access (2) uwp C# (2) めし (2) 整備 (2) 音楽 (2) MIDI (1) diy (1) 会計 (1) 動画再生 (1) 生活 (1) 郵便 (1) 食べ物 (1)

2014年8月28日木曜日

2014年8月27日水曜日

総当たり攻撃、 Brute force attack、 DoS、 DDoS 攻撃 対策 hashllimit ssh iptables 設定

とりあえず、今の攻撃を止めたい場合。
iptables -I INPUT -s 222.186.190.6 -j DROP
service iptables save


(2017/07/16ここから)
最近、一日に一万回以上のアタックをしてくるところが何か所かある。それ自体はほとんどがrootでやってくるから、何万回やられても大丈夫なのだけど、tailでsecureログを見てると目が回るしなんとなくそこまでやられると怖いものがあると思って真面目にそれらを止める気になった。(ほんとに危険なアタックがログに埋もれるし。)
hashlimitが入っているのに何でこんなに来るのかとよーく考えてみたら、hashlimitはポート22を監視しているのに、攻撃側はいろいろなポートを変えながら来ている。だからhashlimitは無駄に多く来るアタックを防ぐのには役に立たない。だからと言ってhashlimitでtcm全体を規制にかけてしまうと他に影響が出てしまう。でも、自分のsshのポートをついてきてほんとに危ない時には守ってくれるから、hashlimitは絶対に入れておいた方がいい。


無駄に多く来るアタックを確実に止めるにはアタックしてくるipを登録して遮断するのが一番いいみたいだ。自動で登録できるようにスクリプトを書いてもいいし、logwatchを見て目立つipをdropに登録してもいい。
logwatchで目立つipを見つけるのには
秀丸検索窓にでもコピーして、正規表現
\d{3,5} time
秀丸マクロでは
searchdown "\\d{3,5} time", nocasesense, regular;
(マクロで使うときは\dの前にエスケープ文字\が入る)
をすると3桁から5桁の間でアタックしてきたアドレスを簡単に探せる。

とりあえず2つ登録しただけでだいぶアタックが少なくなった。
と思ったら、少し間をおいてみてみたら、ほかのipからのアタックが始まった。
なにこれ?連携しているのか?
2,3分静かになった後でまた、他のipからのアタックが始まる。
しばらくは、アタックをしてくるアドレスの登録を自動でしないとダメか。

自動登録は他の人のスクリプトを使わせてもらって、それを少し改造した。
下の方に書いた。

でも、こういうのは少し怖い。これをwebサイトのログインに仕掛けられたらたまったもんじゃない。(drupalなどは何もしなくとも単純なアタックには対策が取られている。)
(2017/07/16ここまで)

ここから下はかなり前に設定したhashlimitの設定。

iptablesを使って対策をする。
(自分はCentOS6を使っている。先月7月7日にCentOS7が公開されて、7ではiptablesがfirewalldという物になったそうだ。iptablesがfirewalldに含まれるということらしい。)

まず最初に、
/etc/sysconfig/iptables
が存在するかどうかの確認をする。
なければ、
#system-config-firewall-tui
(以前はsystem-config-secutitylevel-tui)
で、iptablesを有効にすると、iptablesが作成される。

現在の設定の確認。
#iptables -L
ついでに、ファイルも確認。
#vi /etc/sysconfig/iptables

次に、iptablesが、全部のパケットを受け入れる状態を作っていく。
(自分の場合は、外からの通信はルーターにファイアーウォールを任せてあるので、内側にあるサーバーはパケット全部をacceptするのが基本になっている。)

#service iptables stop
としてiptablesを止めて、全てのチェーンの削除。
#iptables -F

その後、念のため、ユーザー定義チェーンの削除。
#iptables -X

確認
#iptables -L

この設定は、今現在の一時的な設定で、保存をしないと/etc/sysconfig/iptablesが書き換えられないから、
#service iptables save
として/etc/sysconfig/iptablesに保存しておく。

次に、sshのbrute forceアタック等のパケットの制限--DOS的パケットをフィルタリングするための設定に移る。

コマンドiptablesを実行する。
次の3つ。
確立された接続はそのまま継続させる。
iptables -A INPUT -j ACCEPT -p tcp --dport 22 -m state --state ESTABLISHED,RELATED

sshのacceptする条件。(/proc/net/ipt_hashlimit/にout_sshファイルが作られる)
iptables -A INPUT -j ACCEPT -p tcp --dport 22 -m hashlimit --hashlimit 3/minute --hashlimit-burst 3 --hashlimit-name out_ssh --hashlimit-mode srcip,dstip --hashlimit-htable-expire 60000

iptables -A INPUT -j DROP -p tcp --dport 22

out_sshファイルの場所は
/proc/net/ipt_hashlimit/out_ssh

(この3つの設定は、8年くらい前から
http://dsas.blog.klab.org/archives/50208645.html
に書いてあったものを使わせてもらっている。
一つ一つの解説もそこに書いてある。)

その後、
#service iptables save
#service iptables start

確認
#iptables -L
又は
#vi /etc/sysconfig/iptables
一応、こっちも確認。
#chkconfig --list iptables
-----------------------------------------------------------------
例えば、下の設定は、他のサイトにあった設定なのだけど、このようにicmp(ping)に対してならばうまく動いている。

hashlimit.sh

# HASHCHECK チェインの作成
iptables -N HASHCHECK

# HASHLIMITを使用して接続数の制限実施し許可する
#  -m hashlimit ・・・hashlimitモジュールを使用
#  --hashlimit-name hashcheck_t ・・・ハッシュテーブル名を「hashcheck_t」とする
#  --hashlimit 1/m ・・・時間あたりの接続数を「1/分」に設定
#  --hashlimit-burst 30 ・・・バースト値(上記--hashlimit値を無視して接続できる数)を「30」に設定
#  --hashlimit-mode srcip,dstport ・・・制限対象を「送信元IPアドレス」と「宛先ポート」で識別する
#  --hashlimit-htable-expire 120000 ・・・ハッシュテーブル中のレコード保持期間を「120000ミリ秒」に設定
iptables -A HASHCHECK -m hashlimit --hashlimit-name hashcheck_t \
         --hashlimit 1/m --hashlimit-burst 30 --hashlimit-mode srcip,dstport  \
         --hashlimit-htable-expire 120000 -j ACCEPT

# 許可されなかった通信をログに記録する
iptables -A HASHCHECK -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES HASH DROP] : '

# 許可されなかった通信をDROPする
iptables -A HASHCHECK -j DROP

# チェインを適応
iptables -A INPUT -p icmp  -j HASHCHECK #サンプル ICMPを制限
実際に使用する場合は、HASHLIMITでの制限を行う前に以下の処理を行ったほうがよいでしょう。

信頼できるIPアドレス/IPアドレス帯からの通信を許可(誤爆防止)
確立済み通信[ELATED,ESTABLISHED]の許可(確立済みの通信に対してhashlimit実施することは余り無いように思えます)

-------------------------------------------------------------------
man iptablesのhashlimiの部分

hashlimit
       hashlimit uses hash buckets to express a rate limiting match (like  the
       limit  match)  for a group of connections using a single iptables rule.
       Grouping can be done per-hostgroup (source and/or destination  address)
       and/or  per-port.  It  gives  you the ability to express "N packets per
       time quantum per group":

       matching on source host
              "1000 packets per second for every host in 192.168.0.0/16"

       matching on source prot
              "100 packets per second for every service of 192.168.1.1"

       matching on subnet
              "10000 packets per minute for every /28 subnet in 10.0.0.0/8"

       A hash limit option (--hashlimit-upto, --hashlimit-above)  and  --hash-
       limit-name are required.

       --hashlimit-upto amount[/second|/minute|/hour|/day]
              Match  if  the  rate  is below or equal to amount/quantum. It is
              specified as a number, with an optional time quantum suffix; the
              default is 3/hour.

       --hashlimit-above amount[/second|/minute|/hour|/day]
              Match if the rate is above amount/quantum.

       --hashlimit-burst amount
              Maximum  initial  number  of  packets to match: this number gets
              recharged by one every time the limit  specified  above  is  not
              reached, up to this number; the default is 5.

       --hashlimit-mode {srcip|srcport|dstip|dstport},...
              A comma-separated list of objects to take into consideration. If
              no --hashlimit-mode option is given, hashlimit acts like  limit,
              but at the expensive of doing the hash housekeeping.

       --hashlimit-srcmask prefix
              When  --hashlimit-mode  srcip  is  used,  all  source  addresses
              encountered will be grouped according to the given prefix length
              and  the  so-created subnet will be subject to hashlimit. prefix
              must be between (inclusive) 0 and 32. Note that --hashlimit-src-
              mask 0 is basically doing the same thing as not specifying srcip
              for --hashlimit-mode, but is technically more expensive.
  --hashlimit-dstmask prefix
              Like --hashlimit-srcmask, but for destination addresses.

       --hashlimit-name foo
              The name for the /proc/net/ipt_hashlimit/foo entry.

       --hashlimit-htable-size buckets
              The number of buckets of the hash table

       --hashlimit-htable-max entries
              Maximum entries in the hash.

       --hashlimit-htable-expire msec
              After how many milliseconds do hash entries expire.

       --hashlimit-htable-gcinterval msec
              How many milliseconds between garbage collection intervals.


------------------------------------------------------------------
filterテーブルをファイルに直接書くときは
行頭に「*(アスタリスク)」を付けて、最後を「COMMIT」で指定。その間に書かれた設定がfilterテーブル。

------------------------------------------------------------------
iptables -F はポリシーの変更は行わない。
ポリシーがrejectになっていて、それに続くルールでsshをacceptとして動作させているときには注意。
その場合、iptables -Fをやったとたんにsshが切断される。

それをやってしまった時の対処、対策
この場合iptablesファイルの書き換えはされていないので、
PC本体が近ければ、(pcにモニターとキーボードがついていれば直接操作できるけど・・・)pcの電源を切って再起動させればiptables -Fをやる前のiptablesファイルのセーブはされていないので、それを読み込んで立ち上がる。

もし、pcから遠いところでsshをやっているときは保険をかけておく。

atコマンドに/etc/init.d/iptables restartを登録しておくか、

(sleep 60; /etc/init.d/iptables restart) &

などとしておくか。
----------------------------------------------------------------
自ローカルアドレスをACCEPTしておくには
# iptables -I INPUT -s 192.168.1.0/24 -j ACCEPT

ipアドレス123.45.67.890を拒否したいとき
# iptables -I INPUT -s 123.45.67.890 -j DROP

123.45.67.*を全て拒否(123.45.67.0~123.45.67.255)
# iptables -I INPUT -s 123.45.67.0/24 -j DROP
もしくは iptables に下記を追加
 -A INPUT -s 123.45.67.0/255.255.255.0 -j DROP
----------------------------------------------------------------
iptablesのルールを一行だけ削除したいときは
まず、ルールの行ナンバーを調べる。
iptables -L --line-numbers

次に、チェイン名に続いて行ナンバーを入力する。
iptables -D INPUT 1
----------------------------------------------------------------

さくらサーバーの解説を元に最後に自分に必要なルールを付け足した。
最初にDROPから入る。この方が自分の使っているのよりも安全。

# (1) ポリシーの設定 OUTPUTのみACCEPTにする
*filter
:INPUT   DROP   [0:0]
:FORWARD DROP   [0:0]
:OUTPUT  ACCEPT [0:0]

# (2) ループバック(自分自身からの通信)を許可する
-A INPUT -i lo -j ACCEPT

# (3) データを持たないパケットの接続を破棄する
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# (4) SYNflood攻撃と思われる接続を破棄する
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP

# (5) ステルススキャンと思われる接続を破棄する
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# (6) icmp(ping)の設定
# hashlimitを使う
# -m hashlimit                   hashlimitモジュールを使用する
# —hashlimit-name t_icmp  記録するファイル名
# —hashlimit 1/m               リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10        規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip    ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000   リミットの有効期間。単位はms
-A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

# (7) 確立済みの通信は、ポート番号に関係なく許可する
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# (8) 任意へのDNSアクセスの戻りパケットを受け付ける
-A INPUT -p udp --sport 53 -j ACCEPT

# (9) SSHを許可する設定
# hashlimitを使う
# -m hashlimit                   hashlimitモジュールを使用する
# —hashlimit-name t_sshd 記録するファイル名
# —hashlimit 1/m              リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10       規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip   ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000   リミットの有効期間。単位はms
-A INPUT -p tcp -m state --syn --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

# (10) 個別に許可するプロトコルとポートをここに書き込む。
# この例では、HTTP(TCP 80)とHTTPS(TCP 443)を許可している。
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp --dport 110 -j ACCEPT
-A INPUT -p tcp --dport 25 -j ACCEPT
-A INPUT -p tcp --dport 465 -j ACCEPT
-A INPUT -p tcp --dport 587 -j ACCEPT
-A INPUT -p tcp --dport 993 -j ACCEPT
-A INPUT -p tcp --dport 995 -j ACCEPT
-A INPUT -p tcp --dport 53 -j ACCEPT
-A INPUT -p udp --dport 53 -j ACCEPT
-A INPUT -p tcp --dport 20 -j ACCEPT
-A INPUT -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp --dport 4000:4029 -j ACCEPT

COMMIT
-------------------------------------------------------------
hashlimitはicmp(ping)を規制するのにも使える。
-------------------------------------------------------
secureログ、その他のログからからアタックしてくるIPアドレスを探してそれをiptablesに登録してくれるシェルスクリプトを
Brute Force Attack対策+α(iptables) 20160117
という題のサイトのページで公開してくれている(CentOS6用iptablesだと思う。)。
ちなみに、
Brute Force Attack対策+α(Firewalld) 20170517
という、(たぶん)CentOS7用のファイアウォール版もある。
自分は、それを一日に一回くらいcronで回そうと思っている。
27 03 * * * root /usr/local/bin/brute_force_attack_iptables.sh
そのサイトの人は一分間隔で回しているみたいだけど、自分の場合は一日一回、cronで回しておけば、大丈夫だと思う(環境は人それぞれだから、1分でも間に合わない人もいるのだろう。)。
それで、そのスクリプトをそのまま使うと一回のアドレス登録で一回のメールが来る。
つまり、一回のスクリプトの実行で10個アドレスの登録があると、10通のメールが来てしまう。
一分間隔でcronで回すための設計なのでそれでいいのだけど、自分の場合はそれを一日に一回か二回cronで回す予定なので、
それをまとめて一回のメールで配信するように少しだけ自分用に変更させてもらった。

http://ry.tl/brute_force_attack_iptables.html
こちらを使わせてもらった。
------------------------------------------------------------------------------
#!/bin/sh

# 自分用設定 一時ファイル作成ディレクトリの指定/tmp から /dev/shm
# 自分用設定 メール送信先アドレス rootからhoge@hogepeke.comへ変更。
# 自分用設定 TMP3="$TMP_DIR/brute_force_attack3.tmp"を追加。

export LANG=ja_JP.UTF-8

# Ver 20160115

# 攻撃判断回数(デフォルト10回以上)
NG="10"

# ログ監視の有効化設定 「no」で無効。(デフォルトは全て有効)
# 自分用設定 FTPは未インストール、DNSはキャッシングサーバーとして外からは受け入れていない。named.logも作成していない。
TELNET_CHECK="yes"
SSH_CHECK="yes"
FTP_CHECK="no"
MAIL_CHECK="yes"
HTTP_CHECK="yes"
DNS_CHECK="no"

# 監視ログファイル
SSH_LOG="/var/log/secure"
FTP_LOG="/var/log/vsftpd.log"
MAIL_LOG="/var/log/maillog"
HTTP_LOG="/var/log/httpd/error_log"
HTTP_LOG2="/var/log/httpd/access_log"
DNS_LOG="/var/log/named.log"

# HTTP監視除外ディレクトリ及びファイル設定(デフォルトでは「/home」ディレクトリ 以下に存在するファイル全て)
#DIR="/home"
DIR="/var/www/html"
# 攻撃を検知した際に自分にメールを送信するか否か。「no」で無効。(デフォルト有効)
MAILMESSAGES="yes"
# メール送信先アドレス。(デフォルトroot宛)
MAILADDRESS="hoge@hogepeke.com"

# 動作ログのファイル名
BR_LOG="/var/log/brute_force_attack.log"

# ホワイトリストファイルの指定
WHITE_LIST="/root/allow_ip"
# ブラックリストファイルの指定
BLACK_LIST="/root/deny_ip"
#BLACK_LIST="/etc/hosts.deny"
# →TCP Wrapperを使用する場合は後者

# 一時ファイル作成ディレクトリの指定
TMP_DIR="/dev/shm"

# 以降設定不要

# タイムスタンプ設定
LOG_DATE=`date '+%Y/%m/%d %k:%M:%S'`
# 一時ファイル設定
TMP="$TMP_DIR/brute_force_attack.tmp"
TMP2="$TMP_DIR/brute_force_attack2.tmp"
TMP3="$TMP_DIR/brute_force_attack3.tmp"
# フラグ管理
UP_FLAG=0

function_CORE()
{
        if [ $1 = "TELNET" -a $TELNET_CHECK = "yes" ] ; then
                SYSTEM_NAME="$1"
                grep "login:" $SSH_LOG | grep "FAILED LOGIN" | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" > $TMP
        elif [ $1 = "SSH" -a $SSH_CHECK = "yes" ] ; then
                SYSTEM_NAME="$1"
                grep "sshd" $SSH_LOG | grep "Invalid user" | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" > $TMP
                grep "sshd" $SSH_LOG | grep "Failed password" | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" >> $TMP
        elif [ $1 = "FTP" -a $FTP_CHECK = "yes" ] ; then
                SYSTEM_NAME="$1"
                grep "FAIL LOGIN" $FTP_LOG | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" > $TMP
        elif [ $1 = "MAIL" -a $MAIL_CHECK = "yes" ] ; then
                SYSTEM_NAME="$1"
                grep "authentication failure" $MAIL_LOG | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" > $TMP
                grep "auth failed" $MAIL_LOG | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" >> $TMP
        elif [ $1 = "HTTP" -a $HTTP_CHECK = "yes" ] ; then
                SYSTEM_NAME="$1"
                DIR_LIST=`ls $DIR`
                grep "error" $HTTP_LOG | grep "File does not exist" | grep -v "$DIR_LIST" | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" > $TMP
                grep "error" $HTTP_LOG | grep "script" | grep "not found or unable to stat" | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" >> $TMP
                grep "\.\./" $HTTP_LOG2 | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" >> $TMP
                grep "//" $HTTP_LOG2 | grep -v http:// | grep -v https:// | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" >> $TMP
        elif [ $1 = "DNS" -a $DNS_CHECK = "yes" ] ; then
                SYSTEM_NAME="$1"
                grep "denied" $DNS_LOG | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" > $TMP
        else
                touch $TMP
        fi

        cp -p $TMP $TMP2

        if [ -s $WHITE_LIST ]; then
                WHITE=`cat $WHITE_LIST`
                grep -v "$WHITE" $TMP2 > $TMP
                cp -pr $TMP $TMP2
        else
                touch $TMP
        fi
        if [ -s $BLACK_LIST ]; then
                BLACK=`cat $BLACK_LIST`
                grep -v "$BLACK" $TMP2 > $TMP
        else
                touch $TMP
        fi

        LIST=`cat $TMP`
        for IP in $LIST
        do
                COUNT=`grep -w "$IP" $TMP | wc -l`
                if [ $COUNT -ge $NG ] ; then
                        if [ -s $WHITE_LIST ]; then
                                if [ `grep -w "$IP" $WHITE_LIST` ] ; then
                                        WHITE_FLAG=1
                                else
                                        WHITE_FLAG=0
                                fi
                        else
                                WHITE_FLAG=0
                        fi
                        if [ -s $BLACK_LIST ]; then
                                if [ `grep -w "$IP" $BLACK_LIST` ] ; then
                                        BLACK_FLAG=1
                                else
                                        BLACK_FLAG=0
                                fi
                        else
                                BLACK_FLAG=0
                        fi
                        if [ $WHITE_FLAG -eq 1 -o $BLACK_FLAG -eq 1 ] ; then
                                :
                        else
                                echo "["$LOG_DATE"] ""[$SYSTEM_NAMEログ監視] IP をブラックリストへ登録:"$COUNT "回 ["$IP"]" >> $BR_LOG
                                echo $IP >> $BLACK_LIST
                                iptables -I INPUT -s $IP -j DROP
                                UP_FLAG=1
                                if [ $MAILMESSAGES = "yes" ] ; then
#                                        echo -e "[$SYSTEM_NAME]ログ監視にて、"$COUNT"回の不正なアクセスログを確認。\n対象ホストのIPアドレスをiptables及びブラッ クリストファイルへ追加しました。\n\nIPアドレス [$IP]"| mail -s "$0" $MAILADDRESS
# 自分用設定
                                         echo -e "\n[$SYSTEM_NAME]ログ監視にて、"$COUNT"回の不正なアクセスログを確認。\n対象ホストのIPアドレスをiptables及びブラッ クリストファイルへ追加しました。\nIPアドレス [$IP]">> $TMP3
                                fi
                        fi
                fi
        done
# IPTABLES更新時に設定を保存
        if [ $UP_FLAG -eq 1 ] ; then
                /etc/rc.d/init.d/iptables save
        fi
# 一時ファイル削除
        rm -rf $TMP $TMP2
}

# 実行
function_CORE TELNET
function_CORE SSH
function_CORE FTP
function_CORE MAIL
function_CORE HTTP
function_CORE DNS

# 自分用設定
if [ $MAILMESSAGES = "yes" ] ; then
#TMP3ファイルはdropするファイルがないと作成されない。TMP3ファイルが存在しない場合。
  if [ -e $TMP3 ]; then
    cat $TMP3| mail -s "iptable drop 登録" $MAILADDRESS
  else
    echo "対象IPアドレスはありませんでした" | mail -s "iptables drop 登録" $MAILADDRESS

  fi
fi
rm -rf $TMP3
# 自分用設定 ここまで

----------------------------------------------------
if [ -s /tmp/hoge.txt ]; then
  # 1バイトでも中身があれば何もしない
else
  # 0バイトだったら消す
  rm /tmp/hoge.txt
fi
-------------------------------------------------
2桁の数字だけを検索したいとき [0-9][0-9]
1桁か2桁の数字だけを検索したいとき [0-9]+
参考:桁数を指定する場合。
\d{2,5}
この場合は、2桁から5桁の間。
-----------------------------------------------------
20170726追加
blackリストには登録されるのに、iptablesファイルには登録されないIPが出てきてしまう。
そうなると、そのIPはいつまでたってもブロックされない。
iptablesコマンドが機能しない時があるってことだよなぁ。

iptablesコマンドで登録するのに時間がかかるのが原因なのか?
2重に使うと2回目のコマンドがきかなくなるのかなぁ。
シェルスクリプトはコマンドの処理が終わらないうちに次のコマンドを実行しないと思っていたけど、そうではないのか。
waitとかsleepで前のiptablesコマンドの実行が終わるのを待たせてから次のiptablesコマンドを使うようにすればいいのか?

ブラックリストを作るのをやめて、iptablesファイルをブラックリストとして使えばいいんじゃないか。
スクリプトを実行する前にブラックリストを全部消して、iptablesファイルからip部分だけをコピーするか。
そうしておけば、iptablesコマンドがたとえ失敗したとしても次回の網にかかる。


20170726以前追加
うまく動かなくなったときはブラックリストとiptablesに登録してあるリストを全部削除するとまた動き出す。
: > /root/deny_ip
(:このコロンは何もしない、空のという意味。)
iptables -F
service iptables save
/etc/init.d/iptables restart
(自分のうまく動かなくなった理由は、たぶん、cronでスクリプトを動かしたときにiptablesコマンドだけが動いていないときがあった。だから、ブラックリストにipアドレスが書き込まれて、iptablesのテーブルにipアドレスが書き込まれない状態になった。ブラックリストに書き込まれたアドレスは重複しないようにiptablesに書き込まないから、iptablesコマンドが動かないときにブラックリストに登録されたipアドレスは永遠にdropされない状態になる。たぶん、多く攻撃してくるアドレスは連動している。dropされると次のipアドレスに移るのだけど、dropされなければずーと、そのアドレスが攻撃を続ける。だから、そのipアドレスが生き続けたのかな?)

上のスクリプトの設定で
BLACK_LIST="/root/deny_ip"
#BLACK_LIST="/etc/hosts.deny"
# →TCP Wrapperを使用する場合は後者
の3行があるが、
hosts.denyなどを制御しているTCP_wrapperライブラリはかなり古いものだそうだ。
だから、sshdなどがそれをサポートしていれば使えるのだそうだけど、機能しないこともあるらしい。
iptablesはOSのカーネルの一部として動いているので、速くてより広い範囲でサポートしているらしい。
速いことは速いらしいがiptablesは処理が増えてくるとアクセスができなくなったり、いいことはないらしい。
iptablesには、あまり規則がたまらないようにスクリプトを書き換えた方が自分にはいいのかもしれない。





2014年8月26日火曜日

centos apache httpd.conf Directory 設定 1

apacheのバージョン
#httpd -v
で確認すると、
Server version: Apache/2.2.15 (Unix)

デフォルト設定ファイルの場所は。
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
(conf.d以下へ自分の作ったルールを切り離して保存できる。)

設定。
/var/www/htmlへのアクセスを全てのIPから拒否して
/var/www/html/hogehogeへのアクセスを全てのIPから許可させたいとき。
(メモ:AllowOverrideは、主に.htaccessの許可、不許可。
drupalなどでclean ursを使いたいときは
LoadModule rewrite_module modules/mod_rewrite.soコメントを外して使うが、その動作に関しては.htaccessに書かれる。だからAllowOverrideをAllにしておかないと、drupalは動かない。)
--------------------------------------------------------
<Directory "/var/www/html">

#      AllowOverride All
       AllowOverride None

#       Order allow,deny
#     Allow from 192.168.1.
#     Allow from all

      Order deny,allow
      Deny from all

</Directory>

<Directory "/var/www/html/hogehoge">
#    AllowOverride All
      AllowOverride None

      Order allow,deny
#     Allow from 192.168.1.
      Allow from all
</Directory>
--------------------------------------------------------

httpd.confの中にごちゃごちゃと自分のルールを書いていくと、後でわからなくなる。
自分の付け足したルールを切り離して別のファイルに保存したいときは
-----------------------
#
# Load config files from the config directory "/etc/httpd/conf.d".
#
Include conf.d/*.conf
-----------------------
と、httpd.confに書いてある通りに、自分で作ったルールを別ファイルにして保存する。

設定変更後の再起動
/etc/rc.d/init.d/httpd restart

再起動でエラーが出たりするときは、設定文に全角文字、全角スペースが入っていないかの確認。


dhcp server 割り当て一覧

dhcp割り当ての一覧が記録されているファイル。

/var/lib/dhcpd/dhcpd.leases

趣味別に情報、ニュース発信

山のタイムリーな情報、ニュース。
特に山は時間と共に状況が変化するから・・・。

車、
自転車、
バイク

2014年8月25日月曜日

centos ssh version 2 設定

SSHの設定

最初にリモートログインをホスト名を使ってつなげるようにする。
/etc/hosts.allow

sshd:ALL
と記述。
(ホスト名ではなくてIPアドレスで指定すれば、sshd:ALLと記述しなくてもつながる。)

次に鍵セットを作っていく。
(ここではユーザー名をUserNameとする。)

SSH プロトコル・バージョン2の鍵セットは2種類あり、自分はRSAを使う(rsa1はバージョン1用)。

鍵セット、RSAとDSAの違い。

RSA--ユーザ認証と通信の暗号化を行う。
DSA--ユーザー認証の暗号化だけを行う。
一般的にはRSAが使われるらしい。

自分はRSAを使っている(自分の昔のメモを見て知った。設定をしたときは知っているけど、作り終えればすぐに忘れてしまう)。

レンタルサーバーを使っている場合は、クライアント側で鍵ペアを作る。
今回はサーバー側で鍵を作ってクライアント(Windows)に秘密鍵を移動し、puttyで使用する。

最初に鍵を作りたいユーザーでログインする。
     ここでユーザーを新しく作るときは
          # useradd UserName
          # passwd UserName

ユーザー名が表示されないとき(自分の場合は何故か表示されなくなってしまった。-bash-4.16などと表示される。何故だ?後述: ユーザーディレクトリをsambaで共有させるとそうなってしまうみたいだ。sambaの共有を解除したら正常になった。どっちみち公開サーバーにはsambaは使わない。)は
whoami
でユーザー名表示
現在の場所は
pwd
で確認できる。

---------------------------------------------------------------------------------
今はrootになる必要はないが、suに"-"をつけたときとつけないときの違いを見つけたので一応メモ
"su"  rootユーザに切り替わるがrootユーザ環境にはならない。

"su -"  rootユーザになりrootユーザの環境を使用する(ユーザーとディレクトリ、共にrootに移動)。

ユーザーの切り替えも同じ
"su UserName"
"su - UserName"
正確な違いがわかない。"-"をつけとけば無難。
---------------------------------------------------------------------------------

次に、鍵の作成。
$ ssh-keygen -t rsa
ここで、保存場所とパスフレーズを入力。
(このパスフレーズはスペースも使える。)


できた秘密鍵と公開鍵がそれぞれ
UserName/.ssh/id_rsa
UserName/.ssh/id_rsa.pub
になり、
公開鍵、id_rsa.pubを
UserName/.ssh/authorized_key
に追加する。(authorized_keyはテキストファイル。存在しなければcatで付け加えるときに新たに作られる。)

$ cat /home/UserName/.ssh/id_rsa.pub >> /home/UserName/.ssh/authorized_keys

公開鍵をユーザ自身だけにアクセスできるように変更。
#chown UseName:UserName /home/UserName/.ssh/authorized_keys
#chmod 600 /home/UserName/.ssh/authorized_keys

公開鍵の削除
#rm -f /home/UserName/.ssh/id_rsa.pub

ここから先はWindows側
puttyから操作をするように設定をする。

秘密鍵をWindows側にFTPを使うなりなんなりして適当なWindows側フォルダーにコピーをして
puttyが使える形に秘密鍵を変換するためのputty付属のputtygen.exeを立ち上げる。

「File」 > 「Load private key」
で秘密鍵を読み込んで、
パスフレーズを入力。

「File」 > 「Save private key」
で適当な名前をつけて、適当な場所に保存。
ここで、puttygen.exeを閉じる。

次にputty本体を立ち上げて
「Category」 > 「Connection」 > 「SSH」 > 「Auth」
で、秘密鍵の場所の指定をする。

SSHの公式ポートは22/TCPになっている。
そこいら辺は空いてるポートを適当に。


以下、
/etc/ssh/sshd_config
の編集。

rootでのログインを禁止しておく。
#PermitRootLogin yes

PermitRootLogin no

通常パスワードを禁止しておく
#PasswordAuthentication yes

PasswordAuthentication no

空パスワードを禁止しておく。
#PermitEmptyPasswords no

PermitEmptyPasswords no

最後にSSHの再起動。
# service sshd restart

2014年8月17日日曜日

泊まるところ。

それぞれの人が地元の安く泊まるところの紹介。
健康ランドも含む。
他県の人へ。
他国の人へ。

2014年8月12日火曜日

電気屋さんのネットワークを作る

電気屋さんと言っても、配電盤などの工事をやる電気屋さん。

仕事別に必要な資格、許可、免許の一覧みたいな物

drupal 7 コンテンツを追加できなくなってしまったとき。

コンテンツを付け足そうとしたら、

You have not created any content types yet. Go to the content type creation page to add a new content type.

と言われて既に作られているコンテンツが追加できなくなってしまった。


解決方法。
Home » Administration » Structure

「Navigation」の「list links」をクリックする。
(/admin/structure/menu/manage/navigation)

ここで、ENABLEDにチェックを入れる。
ここのチェックを外した覚えはないのだけど、外れていた。
少し前のdrupalをアップデートしたときに、ここのチェックが外れたのかな?

最後にセーブするのを忘れないように。

(後述、drupalをアップデートしていないのに、また同じ現象が起きた。何がきっかけでこうなるのだろうなぁ?)

2014年8月10日日曜日

drupal 7 favicon ファビコン override

下のやり方は正しくない。
http://yasutam.blogspot.jp/2017/06/favicon.html


misc/favicon.ico
に大元のファビコンがある。
これをオーバーライドするために自分のテーマのディレクトリ以下に
自分で作ったfavicon.ico
を置く。
faviconのサイズは16x16ピクセル。

BMP形式で保存して、icoに書き換えた。

2014年8月7日木曜日

Kensington Expert Mouse OpticalBlack トラックボール マウス

昨日、

Kensington
Expert Mouse OpticalBlack
が届いた。
楽天ソフマップ
価格 8,400円 (税込 9,072 円) 送料込
ポイントアップ 5倍 420ポイント

昔は
SlimBlade Trackball 72327JP
が欲しかったのだけど、デザインの好みがExpert Mouseに変わってきたんで。
届いてから気がついたのだけど、SlimBadeはトラックボールでスクロールができる。
そういう効率的な所を知ってしまうと、SlimBladeでも良かったのかなぁ。とも思う。



drupal-8.0.0-alpha14 インストール

インストール途中の必要条件の検証(Verify requirements)の所でalpha13にでなかったエラー(Error)が出た。
自分の環境は
Windows7
WAMP
PHPのバージョンは5.4.12

エラー文は、
「PHP extensions Disabled
Drupal requires you to enable the PHP extensions in the following list (see the <a href="http://drupal.org/requirements">system requirements page</a> for more information):<div class="item-list"><ul><li>fileinfo</li></ul></div>」(英語文)

「PHP拡張 無効
Drupalを使用するには、以下のPHP拡張を有効にしてください (詳しくは <a href="http://drupal.org/requirements">システム要件ページ</a>を参照してください):<div class="item-list"><ul><li>fileinfo</li></ul></div>」(日本語文)


PHP拡張が無効って言われてもなぁ。
もうちょっと具体的に言われないと、自分にはわからない。
システム要件ページを参照って言われても広すぎるし・・・。

と思っていたら同じエラーのことを言っている人がいる・・・
https://www.drupal.org/node/2315033

それによると、
php fileinfo extension libをインストールすればいいとのこと。
でも、PHP5.3以上はデフォルトでONになっている。と、どこかに書いてあったが。。。
と思いながら自分のPHPの設定を見てみるとオフになっていた。
ONにして、インストールを再開するとエラーもなく完了。

Drupal 8。調子いい。
もうそろそろリリースしてもいいんじゃない?
Comming soon.とは書いてあるけど・・・
来月あたりかな。