2014年1月29日水曜日

torからのアクセスだったりをiptablesで検知・拒否して接続させないようにしたい

何か物騒な世の中なので、一応対策らしいものもしなければ、ということで、iptablesで拒否してみることにした。
iptablesにはいつも通りシェルスクリプトで読ませることにする。

この前
http://roserogue.blogspot.jp/2014/01/centosiptablesip.html
で海外からのアクセスを禁止したい記事を入れたのでこちらも参照のこと。

参考は
http://d.hatena.ne.jp/rudeboyjet/20070226/p1

内容としては、IPDENYTORという名前のユーザー定義チェインを作成(-N)して、
ログを取りアクセスはドロップする設定を書き、
if文で/root/denytorlistの中に書いてあるIPアドレスをDROPする。

vi /root/iptables_denytor.sh

#!/bin/sh
################################################
#DENY TOR
################################################
iptables -N IPDENYTOR
iptables -A IPDENYTOR -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES IPDENYTOR]: '
iptables -A IPDENYTOR -j DROP
if [ -s /root/denytorlist ]; then
  for ip in `cat /root/denytorlist`; do
    iptables -A INPUT -s $ip -j IPDENYTOR
  done
fi

chmod 700 /root/iptables_denytor.sh

denytorlistという、torのIPアドレスを貼り付けたものを作る
touch /root/denytorlist
vi /root/denytorlist
ipアドレスは、以下のサイトからIPアドレスのcsvを取ってきて貼る。
http://torstatus.blutmagie.de/index.php
csvへの直リンクが出来なそうなので、wgetで取得するのは無理そう?

chmod 700 /root/denytorlist

あとは/etc/rc.d/rc.localに
sh /root/iptables_denytor.sh
を入れればOKのはず。

ただ、読ませるのに相当時間がかかるので、これやる必要あるのか?というのも勿論ある。
まあ禁止リストの一環と思えば・・・。

修正。
denytorlistは実行できん・・・多分脳が寝ていた。。

2014年1月27日月曜日

linuxを丸ごとバックアップをしたい(ddかdumpか、それが問題だ)

何故かmondo rescueが激調子悪い今、どうしようか、
ということで、ddとdumpを使うことにする。

方法:dd
ddはセクター単位でバックアップをしていく(簡単に言うと、ディスクに書き込まれているデータを「そのまま」バックアップする)ようなので、
「まさに正しいバックアップを取れる」が、その代わりぶち壊れることもある(認識しなかったりする)らしい。
しかし、imgファイルとしてバックアップすれば、中身はマウントしてみられるので、まあ悪くはないと思う。

http://takuya-1st.hatenablog.jp/entry/20101025/1288002819

の通りで、コマンドは
dd if=バックアップするディスク(例:/dev/sda1) of=バックアップ先(例:/media/mountdisk/backup.img)

if=がバックアップ元指定、of=がバックアップ先指定。


dd でディスクからイメージファイルへ

HDDに空き容量があるなら、イメージファイルを作っちゃうのが後で使いやすい。

dd if=/dev/sdb of=/var/disk-img/some-winXp-hdd.img

とURLでは書かれているので、ドライブ丸ごとバックアップも可能だろう。

バックアップの途中経過は
killall -USR1 dd
で見られる。他詳しくはURL参照のこと。

imgファイルのマウント方法は、
mount -o loop マウント先 マウントしたいimg
たとえば
mount -o loop /media/image/ /media/mountdisk/backup.img

方法:dump
dumpは恥ずかしながら一階も触ったことがない。
大抵のドキュメントが、詳しいのかそうで無いのかよく分からない説明ばかりだから。
一応
http://www.usupi.org/sysad/122.html
http://chidipy.jpn.com/server/other/ext3backuprestore.html
を見て、

dump -0 -f バックアップファイル バックアップ対象のパス
というのは分かった。
dump -0f /media/backup/sda5.dump /dev/sda5
こんな感じでバックアップを取る。

また、パーティション構造も記録(UUIDが違うと駄目だったりするらしいのでuuidも)

fdisk -l > /<任意の場所>/fdisk_<デバイス名>.txt
df -k > /<任意の場所>/df.txt # cat /etc/fstab > /<任意の場所>/fs.txt
ls -l /dev/disk/by-uuid/ > /<任意の場所>/by-uuid.txt
#以下はあるのとないのがある。
pvdisplay > /<任意の場所>/lv.txt
vgdisplay > /<任意の場所>/vg.txt
lvdisplay > /<任意の場所>/vp.txt

さて書き戻し方だけど、
http://www.atmarkit.co.jp/ait/articles/0301/07/news001_3.html
とか、他諸々を参考に・・・実は未だ書き戻していなかったりする。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1332476248
は、ddでバックアップを取るか、dumpでバックアップを取るか、どちらが良いかの参考になる。

好みは、ddかな・・・。

2014年1月22日水曜日

兎に角海外からのアクセスを制限、遮断したい(centos上でiptablesを使ったIPアドレスアクセス制限)

サーバ立てていると、兎に角どこから沸いてきたのか辞書攻撃をばんばんする輩がいる。
勘弁してください・・・ddosとか掛けられると速攻落ちるくらいの貧弱スペックで運用してる奴に限って、
何故か半端ない・・・。





環境は
centos(サーバはcentos5とcentos6)とiptables。


hosts.allowとhosts.denyで制限するという方法も散見されたが、正直どうだろう。
正しいと思うけど、複雑なことをさせようとすると凄いことになりそう。

で、その対処法。
まず考えたのは、SSHを通しているので、こいつに辞書攻撃を仕掛けられていること。

http://blog.browncat.org/2007/07/sshiptables2.html

を参考に、2行書いてやればかなり収まる。
60秒間に8回SSH接続しようとしたIPをはじく、とある。

-A RH-Firewall-1-INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
-A RH-Firewall-1-INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

がcentosには適応する。

が、それだけでは怒りが収まらない。
こうなったらと、日本以外の外国からアクセスを遮断することにする。

http://vogel.at.webry.info/201306/article_1.html

http://vogel.at.webry.info/201306/article_2.html
を参考に(というか丸パクりして)設定。

以下は僕の環境下で使ったmemoなので、ちゃんとしたものと解説はURLの方参照してください。

#!/bin/sh
#COPYRIGHT
#http://vogel.at.webry.info/201306/article_1.html
#http://vogel.at.webry.info/201306/article_2.html
#http://blog.browncat.org/2007/07/sshiptables2.html
IPTABLES=/sbin/iptables
if [ $# -eq 1 ]
then
    if [ $1 = "stop" ]
    then
        $IPTABLES -F
        $IPTABLES -Z
        $IPTABLES -X
        $IPTABLES -P INPUT ACCEPT
        $IPTABLES -P OUTPUT ACCEPT
        $IPTABLES -P FORWARD DROP
        echo stopped..
        exit
    fi
fi
$IPTABLES -F
$IPTABLES -Z
$IPTABLES -X
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -N ACCEPT_FILTER
$IPTABLES -A ACCEPT_FILTER -j ACCEPT
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type redirect -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT

$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT_FILTER

$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

#SSH Accept(上2行は別から)
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT_FILTER

#WWW Accept
#$IPTABLES -A INPUT -p tcp -m multiport --dport 80,443 -m state --state NEW -j ACCEPT_FILTER

#日本のIPからのみアクセス出来る
wget -N http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip -q -f -c cidr.txt.gz > cidr.txt
if [ -f cidr.txt ]; then
    $IPTABLES -F ACCEPT_FILTER
    sed -n 's/^JP\t//p' cidr.txt | while read address; do
        $IPTABLES -A ACCEPT_FILTER -s $address -j ACCEPT
    done
    $IPTABLES -A ACCEPT_FILTER -j DROP
fi
#eof
シェルスクリプトなので、実行可能な場所において、ファイル名.shで保存(もういっそ/rootとか)、
chown root.
chmod 700
(rootの持ち物(ドットまで入れるとグループもrootになる)で、アクセス権はルートのみフルアクセス)
/etc/rc.d/rc.local

sh /ファイルまでの絶対パス/ファイル名.sh
とかの形式で書いてやれば、起動時に読み込んでくれる。

これで収まった。
味噌は、有志がIPアドレスレンジのファイルを公開してくれてるところ。凄いよなあ・・・。

追記
torのアクセス遮断を別記事で

2014年1月21日火曜日

中途半端に旧バージョンのphpをcentosにインストールしたい(外部リポジトリだけどolds内にある時)

いまいちyumの仕組みが分かっていないけど、旧バージョンのphp関係をインストールしなければならなくなったので、そのメモ。

今回はcentos5指定だったので、centos5.10(i386版)にphpの旧バージョン5.3をインストール。


ここを参考にする。
http://blog.hello-world.jp.net/?p=584
http://d.hatena.ne.jp/omiyan/20110114/p1

remiリポジトリを登録して、更に

http://rpms.famillecollet.com/enterprise/5/olds/i386/
(URLはremiリポジトリのディレクトリ)
からパッケージをダウンロードしておかなければならない。

外部リポジトリの追加方法は
http://oxynotes.com/?p=4792
を参照。

remi    Fedora プロジェクトのコントリビュータでもある Remi Collet 氏が運営しているリポジトリhttp://www.1x1.jp/blog/2013/12/how-to-install-php-rpm-on-centos-5-and-6-amazone-linux.html
epel    レッドハット(fedoraプロジェクト)提供のリポジトリ。https://fedoraproject.org/wiki/EPEL/ja
ius    PHPとMySQLの普及振興を目的としたリポジトリ。http://iuscommunity.org/pages/About.html

ダウンロードして置かないと、yum install php-5.3*とか入れても、そんなパッケージは無いと怒られる。
釈然としないがそんなものなのだろう(多分oldsの中だからと勝手に推測する)。

i386版なので、参考URLのシェルスクリプトをいじって、i386版をダウンロードするようにする。

#! /bin/bash
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-cli-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-common-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-bcmath-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-dba-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-devel-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-gd-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-imap-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-ldap-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-mbstring-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-mysql-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-odbc-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-pdo-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-pear-1.9.4-7.el5.remi.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-pecl-ncurses-1.0.2-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-pgsql-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-process-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-snmp-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-soap-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-xml-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-xmlrpc-5.3.23-1.el5.remi.i386.rpm
wget http://rpms.famillecollet.com/enterprise/5/olds/i386/php-pecl-apc-3.1.13-3.el5.remi.i386.rpm

ダウンロードできたら、

yum install --enablerepo=remi,epel php-common-5.3.23* php-cli-5.3.23* hp-5.3.23*

とかでインストール。
rpmコマンドでも多分インストールできるが、必要パッケージがないとか言われることがある。


勘所は、
remiだけでなくepelもリポジトリとして登録しておくこと。
なんとremiだけだと、libeditを見つけられずにエラーが出た。
うへえ。