CentOS
の編集
http://www.abetake.com/pukiwiki/?CentOS
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
''目次'' #contents ~ ---- *時刻の同期 [#ld716f12] 下記のコマンドでOS時刻をntpサーバに同期できる。~ [root@XXXXX ~]# ntpdate ntp.nict.jp ''ntp.nict.jp''は日本標準時を供給している[[独立行政法人情報通信研究機構(NICT)>http://www.nict.go.jp/]]の公開NTPサーバ。~ **定期的に時刻を同期 [#sd5bdf44] ''ntpdate''コマンドで時刻同期させても、その後時間の経過とともにOS時刻にズレが生じるので、''cron''で定期的に時刻同期を行い、正確さを保つようにする。cronとは、決められた時刻にコマンドを定期的に実行させるためのデーモンプロセス。~ ~ まずは、cronが動作しているかどうか確認。~ [root@XXXXX ~]# /etc/rc.d/init.d/crond status crond (pid ****) is running... ←動作中 動作していない場合は起動する。 [root@XXXXX ~]# /etc/rc.d/init.d/crond start Starting crond: [ OK ] cronの設定を行う。 [root@XXXXX ~]# crontab -e 初期状態では何も設定されていない(空欄)ので設定を追加する。 (例)毎日AM6時に時刻同期を行う場合 0 6 * * * ntpdate ntp.nict.jp (※cronの設定については詳しく説明されたサイトが他にあるので割愛) 設定を終了すると、 crontab: installing new crontab とコンソールに表示される。 (cronの参考にしたサイト → [[Linuxで自宅サーバ構築»Linux»cronの設定・実行>http://linuxserver.jp/linux/cron%E8%A8%AD%E5%AE%9A.php]]) ~ *コマンド実行結果のログを残す [#b5668b38] コマンド実行時、画面にコマンド実行結果が表示されるが量が多くて表示しきれない場合がある。~ 例えば make コマンドは、エラーが起こっても途中で終了せず、以降の処理を続けることがあるが、どこで失敗したのか画面上で確認したくても、~ 画面上からスクロールしてしまっており確認できないことが多い。だからといって、出力をファイルにリダイレクトしてしまうと、画面上で処理過程を見ることができなくなってしまう。~ ~ 以上のように出力内容を後から見返したい場合もあるのでコマンド実行結果をログとして残す場合は tee コマンドを使用して下記のようにすることで、画面とファイルの両方に出力される。~ (例) opensslのconfig時のログをソースフォルダに20130207_config.logとして残す場合 [root@XXXXX ~]# cd /usr/local/src/openssl-1.0.1d [root@XXXXX openssl-1.0.1d]# ./config --prefix=/usr --openssldir=/etc/pki/tls shared | tee 20130207_config.log tee コマンドの後ろには複数のファイル名を記述する事もできる。また、-a オプションを付けると同名ファイルがある場合には上書きせずに追記することができる。 ~ *フロッピーのマウント [#g375d5fb] 参考サイト:[[Linux/CentOS ネットワーク実験室>http://centos.it-cafe.jp/]]-第9話/ファイルシステムの管理 +''カーネルモジュールのロード''~ 最近のバージョンの OS では、フロッピーのカーネルモジュール(デバイスドライバ)がロードされていない場合があるので、次のコマンドでロードする。~ # modprobe floppy ~ +''マウントポイントのフォルダを作成'' # mkdir /mnt/floppy ~ +''/etc/fstabを編集する'' # vi /etc/fstab /dev/fd0 /mnt/floppy vfat noauto 0 0 ← この1行を追加 ~ +''root以外でもmountできるようにする'' # visudo 〜(略)〜 ## Allow root to run any commands anyware root ALL=(ALL) ALL hoge ALL=(ALL) ALL ← この1行を追加 ~ +''使い方'' -最近のバージョンの OS では、フロッピーのカーネルモジュール(デバイスドライバ)がロードされていない場合があるので、次のコマンドでロードする。 # modprobe floppy -マウント # mount /mnt/floppy root以外では $ sudo mount /mnt/floppy -マウント解除 # umount /mnt/floppy ~ *NASドライブのマウント [#vf55d4e4] NASには共有フォルダとユーザー、パスワードを設定しておく~ 今回は 共有フォルダ名:backup ユーザー名:hoge パスワード:hogehoge +''マウントポイントのフォルダを作成'' #mkdir /mnt/backup +''/etc/fstabを編集する'' #vi /etc/fstab 最後の行に下記を追加 //100.100.100.100/backup /mnt/backup cifs rw,user=hoge,password=hogehoge 0 0 +''使い方'' #mount /mnt/backup *バックアップの実行 [#edadb4fd] **スクリプトの例 [#tbc590e5] どこかのサイトからそのまま拝借して修正~ -バックアップする環境 tracとsubversionで1プロジェクトを構成 ~/proj01ディレクトリにtracとsvnのディレクトリがある tracのDBにはPostgreSQLを使用 subversionはfsで運用(BerkeleyDBは使っていない バックアップ先にはNASを利用 ~ 出来上がったスクリプト「backup.sh」には実行権限が必要 #chmod 755 /path/backup.sh ~ ただし、作成したスクリプトを実行すると、下記エラーがログに出力された。 sudo: sorry, you must have a tty to run sudo なので''sudo''の設定を修正。 #visudo #Defaults requiretty ←この行をコメントアウト ~ 以下スクリプトサンプル #!/bin/bash # # ローカル内でバックアップ # LANG=C # # 設定開始 # # バックアップ先ディレクトリ名 BACKUPDIR=/mnt/backup # バックアップ保存世代数 # ※当日分を含めた過去分バックアップを保存する世代数 # ※過去分バックアップを保存しない場合は1を指定する BACKUPGEN=3 # バックアップログファイル名 BACKUPLOG=$BACKUPDIR/backup.log #PostgreSQL PGPATH=/usr/local/pgsql/bin # # 設定終了 # cd $BACKUPDIR #========================================================================== # 前回バックアップをリネーム #========================================================================== #Log BACKUPFILE=`ls backup.log 2>/dev/null` if [ -f $BACKUPFILE ]; then TIMESTAMP=`ls --full-time $BACKUPFILE|awk '{print $6}'|tr -d -` mv $BACKUPDIR/$BACKUPFILE $BACKUPDIR/${TIMESTAMP}$BACKUPFILE > /dev/null 2>&1 fi #///////////////////////////////////////////////////////// #// #// Sample Proj01 #// for j in 1 2 3 do case $j in '1') PROJ_NAME=Sample-proj01 ;; '2') PROJ_NAME=Sample-proj02 ;; '3') PROJ_NAME=Sample-proj03 ;; esac for i in 1 2 3 do case $i in '1') BACKUPFILE=`ls ${PROJ_NAME}_pgdump.backup.gz 2>/dev/null` ;; '2') BACKUPFILE=`ls ${PROJ_NAME}_trac.tar.gz 2>/dev/null` ;; '3') BACKUPFILE=`ls ${PROJ_NAME}_svn.tar.gz 2>/dev/null` ;; esac if [ -f $BACKUPFILE ]; then TIMESTAMP=`ls --full-time $BACKUPFILE|awk '{print $6}'|tr -d -` mv $BACKUPDIR/$BACKUPFILE $BACKUPDIR/${TIMESTAMP}$BACKUPFILE > /dev/null 2>&1 fi done done #// #// #/////////////////////////////////////////////////////////// #========================================================================== # バックアップログファイル作成 #========================================================================== rm -f $BACKUPLOG touch $BACKUPLOG chmod 400 $BACKUPLOG #========================================================================== # バックアップ実行 #========================================================================== #///////////////////////////////////////////////////////// #// #// Sample Proj #// for j in 1 2 3 do case $j in '1') PROJ_NAME=Sample-proj01 PROJ_PATH=/home/htdocs/Sample/proj01 ;; '2') PROJ_NAME=Sample-proj02 PROJ_PATH=/home/htdocs/Sample/proj02 ;; '3') PROJ_NAME=Sample-proj03 PROJ_PATH=/home/htdocs/Sample/proj03 ;; esac # tracのDBバックアップ echo "`date` backup start [DB:trac_${PROJ_NAME}]" >> $BACKUPLOG sudo -u postgres $PGPATH/vacuumdb trac_${PROJ_NAME} >> $BACKUPLOG 2>&1 sudo -u postgres $PGPATH/pg_dump --file=${PROJ_NAME}_pgdump.backup trac_${PROJ_NAME} >> $BACKUPLOG 2>&1 gzip ${PROJ_NAME}_pgdump.backup >> $BACKUPLOG 2>&1 echo "`date` backup end [DB:trac_${PROJ_NAME}]" >> $BACKUPLOG for i in trac svn do echo "`date` backup start [${PROJ_NAME} ${i}]" >> $BACKUPLOG tar czvfP $BACKUPDIR/${PROJ_NAME}_${i}.tar.gz $PROJ_PATH/${i} >> $BACKUPLOG 2>&1 echo "`date` backup end [${PROJ_NAME} ${i}]" >> $BACKUPLOG done done #// #// #/////////////////////////////////////////////////////////// #========================================================================== # バックアップ保存世代を超えた古いバックアップを削除 #========================================================================== #Log BACKUPFILE=$BACKUPDIR/*backup.log if [ $(ls $BACKUPFILE|wc -l) -gt $BACKUPGEN ]; then OLDBACKUPCNT=`expr $(ls $BACKUPFILE|wc -l) - $BACKUPGEN` for file in `ls -t $BACKUPFILE|tail -n $OLDBACKUPCNT` do rm -f $file done fi #///////////////////////////////////////////////////////// #// #// Sample Proj #// for j in 1 2 3 do case $j in '1') PROJ_NAME=Sample-proj01 ;; '2') PROJ_NAME=Sample-proj02 ;; '3') PROJ_NAME=Sample-proj03 ;; esac for i in 1 2 3 do case $i in '1') BACKUPFILE=$BACKUPDIR/*${PROJ_NAME}_pgdump.backup.gz ;; '2') BACKUPFILE=$BACKUPDIR/*${PROJ_NAME}_trac.tar.gz ;; '3') BACKUPFILE=$BACKUPDIR/*${PROJ_NAME}_svn.tar.gz ;; esac if [ $(ls $BACKUPFILE|wc -l) -gt $BACKUPGEN ]; then OLDBACKUPCNT=`expr $(ls $BACKUPFILE|wc -l) - $BACKUPGEN` for file in `ls -t $BACKUPFILE|tail -n $OLDBACKUPCNT` do rm -f $file done fi done done #// #// #/////////////////////////////////////////////////////////// **cronでの自動実行 [#z73e242e] 参考サイト:[[NEC 8番街 - croの設定ガイド:http://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html]] #crontab -e ~ 毎日1時に実行 0 1 * * * /path/backup.sh 日時指定の書式は左から「分、時、日、月、曜日」それにコマンドが続く 上記の例では「1時0分」それ以外が「*」なので毎日実行される。~ これが例えば 0 1 1 * * /path/backup.sh だったら毎月1日の1時0分に実行される ~ *htpasswdへのユーザー登録 [#l978336f] ユーザーhogehogeで新規に認証用ファイル.htpasswdを作成 # htpasswd -c /home/htdocs/.htpasswd hogehoge ~ ユーザーhogehoge2を既存の認証用ファイル.htpasswdに追加 # htpasswd /home/htdocs/.htpasswd hogehoge2 ~ 「command not found」が出たら # PATH=$PATH:/usr/local/apache2/bin # export PATH ~ *ファイアウォールの設定 [#wda4f7fd] 参考サイト:[[CentOSで自宅サーバー構築 ファイアウォール構築(iptables)>http://centossrv.com/iptables.shtml]] **iptables設定 [#qc0eb70b] +''iptablesの設定用スクリプトを作成'' # vi iptables.sh ~ 下記の通り記述~ 公開するポートのみコメントを外す #!/bin/bash #---------------------------------------# # 設定開始 # #---------------------------------------# # インタフェース名定義 LAN=eth0 #---------------------------------------# # 設定終了 # #---------------------------------------# # 内部ネットワークのネットマスク取得 LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` # 内部ネットワークアドレス取得 LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '` LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK # ファイアウォール停止(すべてのルールをクリア) /etc/rc.d/init.d/iptables stop # デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定 iptables -P INPUT DROP # 受信はすべて破棄 iptables -P OUTPUT ACCEPT # 送信はすべて許可 iptables -P FORWARD DROP # 通過はすべて破棄 # 自ホストからのアクセスをすべて許可 iptables -A INPUT -i lo -j ACCEPT # 内部からのアクセスをすべて許可 iptables -A INPUT -s $LOCALNET -j ACCEPT # 内部から行ったアクセスに対する外部からの返答アクセスを許可 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SYN Cookiesを有効にする # ※TCP SYN Flood攻撃対策 sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf # ブロードキャストアドレス宛pingには応答しない # ※Smurf攻撃対策 sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf # ICMP Redirectパケットは拒否 sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf for dev in `ls /proc/sys/net/ipv4/conf/` do sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf done # Source Routedパケットは拒否 sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf for dev in `ls /proc/sys/net/ipv4/conf/` do sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf done # フラグメント化されたパケットはログを記録して破棄 iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : ' iptables -A INPUT -f -j DROP # 外部とのNetBIOS関連のアクセスはログを記録せずに破棄 # ※不要ログ記録防止 iptables -A INPUT -s ! $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A INPUT -s ! $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A OUTPUT -d ! $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP iptables -A OUTPUT -d ! $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP # 1秒間に4回を超えるpingはログを記録して破棄 # ※Ping of Death攻撃対策 iptables -N LOG_PINGDEATH iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : ' iptables -A LOG_PINGDEATH -j DROP iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH # 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄 # ※不要ログ記録防止 iptables -A INPUT -d 255.255.255.255 -j DROP iptables -A INPUT -d 224.0.0.1 -j DROP # 113番ポート(IDENT)へのアクセスには拒否応答 # ※メールサーバ等のレスポンス低下防止 iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset # ACCEPT_COUNTRY_MAKE関数定義 # 指定された国のIPアドレスからのアクセスを許可するユーザ定義チェイン作成 ACCEPT_COUNTRY_MAKE(){ for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'` do iptables -A ACCEPT_COUNTRY -s $addr -j ACCEPT done } # DROP_COUNTRY_MAKE関数定義 # 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成 DROP_COUNTRY_MAKE(){ for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'` do iptables -A DROP_COUNTRY -s $addr -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_COUNTRY] : ' iptables -A DROP_COUNTRY -s $addr -j DROP done } # IPアドレスリスト取得 . /root/iptables_functions IPLISTGET # 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成 iptables -N ACCEPT_COUNTRY ACCEPT_COUNTRY_MAKE JP # 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する # 中国・韓国・台湾※からのアクセスをログを記録して破棄 # ※全国警察施設への攻撃元上位3カ国(日本・アメリカを除く) # http://www.cyberpolice.go.jp/detect/observation.htmlより iptables -N DROP_COUNTRY DROP_COUNTRY_MAKE CN DROP_COUNTRY_MAKE KR DROP_COUNTRY_MAKE TW iptables -A INPUT -j DROP_COUNTRY #----------------------------------------------------------# # 各種サービスを公開する場合の設定(ここから) # #----------------------------------------------------------# # 外部からのTCP22番ポート(SSH)へのアクセスを日本からのみ許可 # ※SSHサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 22 -j ACCEPT_COUNTRY # 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可 # ※外部向けDNSサーバーを運用する場合のみ #iptables -A INPUT -p tcp --dport 53 -j ACCEPT #iptables -A INPUT -p udp --dport 53 -j ACCEPT # 外部からのTCP80番ポート(HTTP)へのアクセスを許可 # ※Webサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 外部からのTCP443番ポート(HTTPS)へのアクセスを許可 # ※Webサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 外部からのTCP21番ポート(FTP)へのアクセスを日本からのみ許可 # ※FTPサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 21 -j ACCEPT_COUNTRY # 外部からのPASV用ポート(FTP-DATA)へのアクセスを日本からのみ許可 # ※FTPサーバーを公開する場合のみ # ※PASV用ポート60000:60030は当サイトの設定例 #iptables -A INPUT -p tcp --dport 60000:60030 -j ACCEPT_COUNTRY # 外部からのTCP25番ポート(SMTP)へのアクセスを許可 # ※SMTPサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 25 -j ACCEPT # 外部からのTCP465番ポート(SMTPS)へのアクセスを日本からのみ許可 # ※SMTPSサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 465 -j ACCEPT_COUNTRY # 外部からのTCP110番ポート(POP3)へのアクセスを日本からのみ許可 # ※POP3サーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 110 -j ACCEPT_COUNTRY # 外部からのTCP995番ポート(POP3S)へのアクセスを日本からのみ許可 # ※POP3Sサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 995 -j ACCEPT_COUNTRY # 外部からのTCP143番ポート(IMAP)へのアクセスを日本からのみ許可 # ※IMAPサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 143 -j ACCEPT_COUNTRY # 外部からのTCP993番ポート(IMAPS)へのアクセスを日本からのみ許可 # ※IMAPSサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 993 -j ACCEPT_COUNTRY # 外部からのUDP1194番ポート(OpenVPN)へのアクセスを日本からのみ許可 # ※OpenVPNサーバーを公開する場合のみ #iptables -A INPUT -p udp --dport 1194 -j ACCEPT_COUNTRY # VPNインタフェース用ファイアウォール設定 # ※OpenVPNサーバーを公開する場合のみ #[ -f /etc/openvpn/openvpn-startup ] && /etc/openvpn/openvpn-startup #----------------------------------------------------------# # 各種サービスを公開する場合の設定(ここまで) # #----------------------------------------------------------# # 拒否IPアドレスからのアクセスはログを記録せずに破棄 # ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと # (/root/deny_ipがなければなにもしない) if [ -s /root/deny_ip ]; then for ip in `cat /root/deny_ip` do iptables -I INPUT -s $ip -j DROP done fi # 上記のルールにマッチしなかったアクセスはログを記録して破棄 iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : ' iptables -A INPUT -j DROP iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : ' iptables -A FORWARD -j DROP # サーバー再起動時にも上記設定が有効となるようにルールを保存 /etc/rc.d/init.d/iptables save # ファイアウォール起動 /etc/rc.d/init.d/iptables start ~ +''設定用スクリプトに実行権限を付加'' # chmod 700 iptables.sh ~ +''設定スクリプト外部関数作成'' # vi iptables_functions ~ 下記の通り記述 # IPアドレスリスト取得関数定義 IPLISTGET(){ # http://nami.jp/ipv4bycc/から最新版IPアドレスリストを取得する wget -q http://nami.jp/ipv4bycc/cidr.txt.gz gunzip cidr.txt.gz # 最新版IPアドレスリストが取得できなかった場合 if [ ! -f cidr.txt ]; then if [ -f /tmp/cidr.txt ]; then # バックアップがある場合はその旨をroot宛にメール通知して処理を打ち切る echo cidr.txt was read from the backup! | mail -s $0 root exit 1 else # バックアップがない場合はその旨をroot宛にメール通知して処理を打ち切る echo cidr.txt not found!|mail -s $0 root exit 1 fi fi # 最新版IPアドレスリストを /tmpへバックアップする /bin/mv cidr.txt /tmp/cidr.txt } ~ **IPアドレスリスト更新チェック [#e11867bb] IPアドレスリストは頻繁に更新されるので、毎日自動でIPアドレスリストの更新有無をチェックし、更新がある場合はファイアウォール設定スクリプトを再起動するようにする。 +''IPアドレスリストチェックスクリプト作成'' # vi /etc/cron.daily/iplist_check.sh ~ 下記の通り記述 #!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # チェック国コード COUNTRY_CODE='JP CN KR TW' # iptables設定スクリプトパス IPTABLES=/root/iptables.sh # iptables設定スクリプト外部関数取り込み . /root/iptables_functions # IPアドレスリスト最新化 rm -f IPLIST.new IPLISTGET for country in $COUNTRY_CODE do if [ -f /tmp/cidr.txt ]; then grep ^$country /tmp/cidr.txt >> IPLIST.new else grep ^$country /tmp/IPLIST >> IPLIST.new fi done # IPアドレスリスト更新チェック diff -q /tmp/IPLIST IPLIST.new > /dev/null 2>&1 if [ $? -ne 0 ]; then /bin/mv IPLIST.new /tmp/IPLIST $IPTABLES > /dev/null else rm -f IPLIST.new fi ~ +''スクリプトに実行権限を付加'' # chmod +x /etc/cron.daily/iplist_check.sh ~ **iptables起動 [#oe124956] +''設定スクリプト実行'' # ./iptables.sh ファイアウォールルールを適用中: [ OK ] チェインポリシーを ACCEPT に設定中filter [ OK ] iptables モジュールを取り外し中 [ OK ] ファイアウォールのルールを /etc/sysconfig/iptables に保存中[ OK ] ファイアウォールルールを適用中: [ OK ] チェインポリシーを ACCEPT に設定中filter [ OK ] iptables モジュールを取り外し中 [ OK ] iptables ファイアウォールルールを適用中: [ OK ] iptables モジュールを読み込み中ip_conntrack_netbios_ns [ OK ] +''iptables自動起動設定'' # chkconfig iptables on ~ *ログローテーション [#ued603c7] -''/etc/logrotate.conf'' の内容 # see "man logrotate" for details # rotate log files weekly weekly ↑毎週ログを置き換える。毎日はdaily、毎月はmonthly # keep 4 weeks worth of backlogs rotate 4 ↑※ログを4世代分残す。weeky を指定した場合は4週間という意味 # create new (empty) log files after rotating old ones create ↑※新規ログファイルをローテーションした直後に作成する # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress ↑※圧縮する。デフォルトは圧縮''しない''(コメントアウト) # RPM packages drop log rotation information into this directory include /etc/logrotate.d ↑※各ログファイルの設定がおかれているパスを指定。 このディレクトリに自身で作成したconfを入れておけば良い # no packages own wtmp and btmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here. ~ **設定値 [#ee9ba0f2] -daily or weekly or monthly~ ログのローテーション間隔~ ~ -missingok~ ログファイルがない場合でもエラーにしない~ ~ -rotate n~ n回ローテーションする~ ~ -compress~ ローテーションされたログを圧縮~ ~ -delaycompress~ 次回のログローテーションサイクルになるまで圧縮しない~ ~ -notifempty~ ログファイルが空ならローテートしない~ ~ -create 0644 user group~ ログファイルのパーミッションと所有ユーザの設定~ ~ -copytruncate~ 通常、ローテートするときは、既存のログを移動させた後に新しいログファイルを作る。copytruncateを指定した場合は動作が変わり、ログのコピーした後に、既存のログのサイズを0にする動作になる。ログファイルを閉じないプログラム(rails含む)は、この指定をしないとずっと同じログファイルに書き込みが行われてしまう。コピーしてサイズを0にする少しの間だけログがlostされる。この指定をするとcreateが無効になる(新しいファイルを作らないので)~ ~ -dateext~ ログファイル末尾につく数値の代わりに日付(YYYYMMDD)がつく~ ~ **apache用のログローテーション設定 [#t1c9bfe3] +''設定ファイルの作成'' # vi /etc/logrotate.d/httpd /usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log { weekly rotate 4 missingok sharedscripts postrotate /bin/killall -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null endscript } ~ +''確認''~ ログのローテートを実行し、/var/lib/logrotate.log を見て、ローテートが実行されたかどうか確認する。~ # /usr/sbin/logrotate /etc/logrotate.conf ← ローテート実行 # cat /var/lib/logrotate.status "/usr/local/apache2/logs/access_log" 2011-12-1 ← 設定したログが表示される "/usr/local/apache2/logs/error_log" 2011-12-1 ← 設定したログが表示される ~ **Redmine用のログローテーション設定 [#t1c9bfe3] +''設定ファイルの作成'' # vi /etc/logrotate.d/redmine /home/htdocs/redmine/log/production.log { weekly rotate 4 missingok copytruncate notifempty } ~ +''確認''~ ログのローテートを実行し、/var/lib/logrotate.log を見て、ローテートが実行されたかどうか確認する。~ # /usr/sbin/logrotate /etc/logrotate.conf ← ローテート実行 # cat /var/lib/logrotate.status "/home/htdocs/redmine/log/production.log" 2011-12-1 ← 設定したログが表示される ~ *ランレベル [#g934a7ae] 参考:[[ランレベルとは?(http://www.atmarkit.co.jp)>http://www.atmarkit.co.jp/flinux/rensai/linuxtips/156whatrunlv.html]] | 0 |シャットダウン(システムの停止)|シャットダウンに向かう状態| | 1 |シングルユーザーモード(rootのみ) |シングルユーザモード| | 2 |ネットワークなしのマルチユーザーモード |使用されない| | 3 |通常のマルチユーザーモード(テキストログイン) |標準的な状態| | 4 | 未使用 |使用されない| | 5 | グラフィカルログインによるマルチユーザーモード |GUIでログインする状態| | 6 | システムの再起動 |再起動に向かう状態| ~ httpd の自動起動を on にする場合 # chkconfig httpd on ~ httpd の自動起動を ランレベル3と5のみ on にする場合 chkconfig --level 35 httpd on ~ 現在のランレベルを調べる場合 # runlevel N 3 ←ひとつ前のランレベルは存在せず、現在のランレベルは3。 ~ *バージョン確認 [#m502e11f] **OS [#scb8de06] # cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m **カーネル [#yd9ec247] # uname -a Linux hogehoge 2.6.32-431.5.1.el6.i686 #1 SMP Tue Feb 11 21:56:33 UTC 2014 i686 i686 i386 GNU/Linux **Apache [#b196ccbc] # httpd -v Server version: Apache/2.2.26 (Unix) Server built: Mar 7 2014 17:07:03 または、 # httpd -V Server version: Apache/2.2.26 (Unix) Server built: Mar 7 2014 17:07:03 Server's Module Magic Number: 20051115:33 Server loaded: APR 1.5.0, APR-Util 1.5.3 Compiled using: APR 1.5.0, APR-Util 1.5.3 Architecture: 32-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=128 -D HTTPD_ROOT="/etc/httpd" -D SUEXEC_BIN="/usr/sbin/suexec" -D DEFAULT_PIDLOG="logs/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_LOCKFILE="logs/accept.lock" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf" **OpenSSH [#p4c2c7c7] # ssh -V OpenSSH_6.5p1, OpenSSL 1.0.1e-fips 11 Feb 2013 **Postfix [#y29a1188] # postconf | grep mail_version mail_version = 2.6.6 milter_macro_v = $mail_name $mail_version **OpenSSL [#ha17286b] # openssl version OpenSSL 1.0.1e-fips 11 Feb 2013 **Ruby [#x24fc118] # ruby -v ruby 2.0.0p451 (2014-02-24 revision 45167) [i686-linux] **Subversion [#d961e7d8] # svn --version svn, version 1.8.8 (r1568071) compiled Feb 17 2014, 18:18:15 on i686-pc-linux-gnu Copyright (C) 2013 The Apache Software Foundation. This software consists of contributions made by many people; see the NOTICE file for more information. Subversion is open source software, see http://subversion.apache.org/ 以下のリポジトリアクセス (RA) モジュールが利用できます: * ra_svn : svn ネットワークプロトコルを使ってリポジトリにアクセスするモジュール。 - Cyrus SASL 認証を併用 - 'svn' スキームを操作します * ra_local : ローカルディスク上のリポジトリにアクセスするモジュール。 - 'file' スキームを操作します * ra_serf : Module for accessing a repository via WebDAV protocol using serf. - using serf 1.3.4 - 'http' スキームを操作します - 'https' スキームを操作します **PostgreSQL [#m3ee8d8c] # yum list installed | grep postgres postgresql93.i686 9.3.3-1PGDG.rhel6 @pgdg93 postgresql93-devel.i686 9.3.3-1PGDG.rhel6 @pgdg93 postgresql93-libs.i686 9.3.3-1PGDG.rhel6 @pgdg93 postgresql93-server.i686 または、 # psql -U postgres postgres=# select version(); version ------------------------------------------------------------------------------------------------------- PostgreSQL 9.3.3 on i686-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 32-bit (1 行) postgres=# \quit **yumでの確認 [#p55a370a] # yum list installed または、 # yum list installed | grep XXXX XXXXは調べたいもの。例えばzlibなら、 # yum list installed | grep zlib zlib.i686 1.2.3-29.el6 @anaconda-CentOS-201311271240.i386/6.5 zlib-devel.i686 1.2.3-29.el6 @base ~ # yum list installed とした時に表示されるリストに黄色と赤の色付きで表示されるものがある。 # man yum.conf を参照すると、黄色に関するものは color_list_installed_newer The colorization/highlighting for packages in list/info installed which are newer than the latest available package with the same name and arch. Default is ‘bold,yellow’. See color_list_installed_older for possible values. 赤に関するものは color_list_installed_extra The colorization/highlighting for packages in list/info installed which has no available package with the same name and arch. Default is ‘bold,red’. See color_list_installed_older for possible values. と記載されている。yum.confはデフォルトのまま使用しているので、~ 黄色は「yumが参照しているリポジトリの最新よりも新しいもの。」~ 赤色は「yumが参照しているリポジトリには同じ名前の利用可能なものがない。」~ といったところかな?~ *容量を調べる [#m63f2220] 例えば/etc/httpdディレクトリの使用容量を調べる場合 # du -h /etc/httpd 76K /etc/httpd/conf/extra 60K /etc/httpd/conf/original/extra 84K /etc/httpd/conf/original 188K /etc/httpd/conf/proj 12K /etc/httpd/conf/ssl 472K /etc/httpd/conf 8.0K /etc/httpd/conf.d 484K /etc/httpd ←/etc/httpd全体の使用容量
タイムスタンプを変更しない
''目次'' #contents ~ ---- *時刻の同期 [#ld716f12] 下記のコマンドでOS時刻をntpサーバに同期できる。~ [root@XXXXX ~]# ntpdate ntp.nict.jp ''ntp.nict.jp''は日本標準時を供給している[[独立行政法人情報通信研究機構(NICT)>http://www.nict.go.jp/]]の公開NTPサーバ。~ **定期的に時刻を同期 [#sd5bdf44] ''ntpdate''コマンドで時刻同期させても、その後時間の経過とともにOS時刻にズレが生じるので、''cron''で定期的に時刻同期を行い、正確さを保つようにする。cronとは、決められた時刻にコマンドを定期的に実行させるためのデーモンプロセス。~ ~ まずは、cronが動作しているかどうか確認。~ [root@XXXXX ~]# /etc/rc.d/init.d/crond status crond (pid ****) is running... ←動作中 動作していない場合は起動する。 [root@XXXXX ~]# /etc/rc.d/init.d/crond start Starting crond: [ OK ] cronの設定を行う。 [root@XXXXX ~]# crontab -e 初期状態では何も設定されていない(空欄)ので設定を追加する。 (例)毎日AM6時に時刻同期を行う場合 0 6 * * * ntpdate ntp.nict.jp (※cronの設定については詳しく説明されたサイトが他にあるので割愛) 設定を終了すると、 crontab: installing new crontab とコンソールに表示される。 (cronの参考にしたサイト → [[Linuxで自宅サーバ構築»Linux»cronの設定・実行>http://linuxserver.jp/linux/cron%E8%A8%AD%E5%AE%9A.php]]) ~ *コマンド実行結果のログを残す [#b5668b38] コマンド実行時、画面にコマンド実行結果が表示されるが量が多くて表示しきれない場合がある。~ 例えば make コマンドは、エラーが起こっても途中で終了せず、以降の処理を続けることがあるが、どこで失敗したのか画面上で確認したくても、~ 画面上からスクロールしてしまっており確認できないことが多い。だからといって、出力をファイルにリダイレクトしてしまうと、画面上で処理過程を見ることができなくなってしまう。~ ~ 以上のように出力内容を後から見返したい場合もあるのでコマンド実行結果をログとして残す場合は tee コマンドを使用して下記のようにすることで、画面とファイルの両方に出力される。~ (例) opensslのconfig時のログをソースフォルダに20130207_config.logとして残す場合 [root@XXXXX ~]# cd /usr/local/src/openssl-1.0.1d [root@XXXXX openssl-1.0.1d]# ./config --prefix=/usr --openssldir=/etc/pki/tls shared | tee 20130207_config.log tee コマンドの後ろには複数のファイル名を記述する事もできる。また、-a オプションを付けると同名ファイルがある場合には上書きせずに追記することができる。 ~ *フロッピーのマウント [#g375d5fb] 参考サイト:[[Linux/CentOS ネットワーク実験室>http://centos.it-cafe.jp/]]-第9話/ファイルシステムの管理 +''カーネルモジュールのロード''~ 最近のバージョンの OS では、フロッピーのカーネルモジュール(デバイスドライバ)がロードされていない場合があるので、次のコマンドでロードする。~ # modprobe floppy ~ +''マウントポイントのフォルダを作成'' # mkdir /mnt/floppy ~ +''/etc/fstabを編集する'' # vi /etc/fstab /dev/fd0 /mnt/floppy vfat noauto 0 0 ← この1行を追加 ~ +''root以外でもmountできるようにする'' # visudo 〜(略)〜 ## Allow root to run any commands anyware root ALL=(ALL) ALL hoge ALL=(ALL) ALL ← この1行を追加 ~ +''使い方'' -最近のバージョンの OS では、フロッピーのカーネルモジュール(デバイスドライバ)がロードされていない場合があるので、次のコマンドでロードする。 # modprobe floppy -マウント # mount /mnt/floppy root以外では $ sudo mount /mnt/floppy -マウント解除 # umount /mnt/floppy ~ *NASドライブのマウント [#vf55d4e4] NASには共有フォルダとユーザー、パスワードを設定しておく~ 今回は 共有フォルダ名:backup ユーザー名:hoge パスワード:hogehoge +''マウントポイントのフォルダを作成'' #mkdir /mnt/backup +''/etc/fstabを編集する'' #vi /etc/fstab 最後の行に下記を追加 //100.100.100.100/backup /mnt/backup cifs rw,user=hoge,password=hogehoge 0 0 +''使い方'' #mount /mnt/backup *バックアップの実行 [#edadb4fd] **スクリプトの例 [#tbc590e5] どこかのサイトからそのまま拝借して修正~ -バックアップする環境 tracとsubversionで1プロジェクトを構成 ~/proj01ディレクトリにtracとsvnのディレクトリがある tracのDBにはPostgreSQLを使用 subversionはfsで運用(BerkeleyDBは使っていない バックアップ先にはNASを利用 ~ 出来上がったスクリプト「backup.sh」には実行権限が必要 #chmod 755 /path/backup.sh ~ ただし、作成したスクリプトを実行すると、下記エラーがログに出力された。 sudo: sorry, you must have a tty to run sudo なので''sudo''の設定を修正。 #visudo #Defaults requiretty ←この行をコメントアウト ~ 以下スクリプトサンプル #!/bin/bash # # ローカル内でバックアップ # LANG=C # # 設定開始 # # バックアップ先ディレクトリ名 BACKUPDIR=/mnt/backup # バックアップ保存世代数 # ※当日分を含めた過去分バックアップを保存する世代数 # ※過去分バックアップを保存しない場合は1を指定する BACKUPGEN=3 # バックアップログファイル名 BACKUPLOG=$BACKUPDIR/backup.log #PostgreSQL PGPATH=/usr/local/pgsql/bin # # 設定終了 # cd $BACKUPDIR #========================================================================== # 前回バックアップをリネーム #========================================================================== #Log BACKUPFILE=`ls backup.log 2>/dev/null` if [ -f $BACKUPFILE ]; then TIMESTAMP=`ls --full-time $BACKUPFILE|awk '{print $6}'|tr -d -` mv $BACKUPDIR/$BACKUPFILE $BACKUPDIR/${TIMESTAMP}$BACKUPFILE > /dev/null 2>&1 fi #///////////////////////////////////////////////////////// #// #// Sample Proj01 #// for j in 1 2 3 do case $j in '1') PROJ_NAME=Sample-proj01 ;; '2') PROJ_NAME=Sample-proj02 ;; '3') PROJ_NAME=Sample-proj03 ;; esac for i in 1 2 3 do case $i in '1') BACKUPFILE=`ls ${PROJ_NAME}_pgdump.backup.gz 2>/dev/null` ;; '2') BACKUPFILE=`ls ${PROJ_NAME}_trac.tar.gz 2>/dev/null` ;; '3') BACKUPFILE=`ls ${PROJ_NAME}_svn.tar.gz 2>/dev/null` ;; esac if [ -f $BACKUPFILE ]; then TIMESTAMP=`ls --full-time $BACKUPFILE|awk '{print $6}'|tr -d -` mv $BACKUPDIR/$BACKUPFILE $BACKUPDIR/${TIMESTAMP}$BACKUPFILE > /dev/null 2>&1 fi done done #// #// #/////////////////////////////////////////////////////////// #========================================================================== # バックアップログファイル作成 #========================================================================== rm -f $BACKUPLOG touch $BACKUPLOG chmod 400 $BACKUPLOG #========================================================================== # バックアップ実行 #========================================================================== #///////////////////////////////////////////////////////// #// #// Sample Proj #// for j in 1 2 3 do case $j in '1') PROJ_NAME=Sample-proj01 PROJ_PATH=/home/htdocs/Sample/proj01 ;; '2') PROJ_NAME=Sample-proj02 PROJ_PATH=/home/htdocs/Sample/proj02 ;; '3') PROJ_NAME=Sample-proj03 PROJ_PATH=/home/htdocs/Sample/proj03 ;; esac # tracのDBバックアップ echo "`date` backup start [DB:trac_${PROJ_NAME}]" >> $BACKUPLOG sudo -u postgres $PGPATH/vacuumdb trac_${PROJ_NAME} >> $BACKUPLOG 2>&1 sudo -u postgres $PGPATH/pg_dump --file=${PROJ_NAME}_pgdump.backup trac_${PROJ_NAME} >> $BACKUPLOG 2>&1 gzip ${PROJ_NAME}_pgdump.backup >> $BACKUPLOG 2>&1 echo "`date` backup end [DB:trac_${PROJ_NAME}]" >> $BACKUPLOG for i in trac svn do echo "`date` backup start [${PROJ_NAME} ${i}]" >> $BACKUPLOG tar czvfP $BACKUPDIR/${PROJ_NAME}_${i}.tar.gz $PROJ_PATH/${i} >> $BACKUPLOG 2>&1 echo "`date` backup end [${PROJ_NAME} ${i}]" >> $BACKUPLOG done done #// #// #/////////////////////////////////////////////////////////// #========================================================================== # バックアップ保存世代を超えた古いバックアップを削除 #========================================================================== #Log BACKUPFILE=$BACKUPDIR/*backup.log if [ $(ls $BACKUPFILE|wc -l) -gt $BACKUPGEN ]; then OLDBACKUPCNT=`expr $(ls $BACKUPFILE|wc -l) - $BACKUPGEN` for file in `ls -t $BACKUPFILE|tail -n $OLDBACKUPCNT` do rm -f $file done fi #///////////////////////////////////////////////////////// #// #// Sample Proj #// for j in 1 2 3 do case $j in '1') PROJ_NAME=Sample-proj01 ;; '2') PROJ_NAME=Sample-proj02 ;; '3') PROJ_NAME=Sample-proj03 ;; esac for i in 1 2 3 do case $i in '1') BACKUPFILE=$BACKUPDIR/*${PROJ_NAME}_pgdump.backup.gz ;; '2') BACKUPFILE=$BACKUPDIR/*${PROJ_NAME}_trac.tar.gz ;; '3') BACKUPFILE=$BACKUPDIR/*${PROJ_NAME}_svn.tar.gz ;; esac if [ $(ls $BACKUPFILE|wc -l) -gt $BACKUPGEN ]; then OLDBACKUPCNT=`expr $(ls $BACKUPFILE|wc -l) - $BACKUPGEN` for file in `ls -t $BACKUPFILE|tail -n $OLDBACKUPCNT` do rm -f $file done fi done done #// #// #/////////////////////////////////////////////////////////// **cronでの自動実行 [#z73e242e] 参考サイト:[[NEC 8番街 - croの設定ガイド:http://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html]] #crontab -e ~ 毎日1時に実行 0 1 * * * /path/backup.sh 日時指定の書式は左から「分、時、日、月、曜日」それにコマンドが続く 上記の例では「1時0分」それ以外が「*」なので毎日実行される。~ これが例えば 0 1 1 * * /path/backup.sh だったら毎月1日の1時0分に実行される ~ *htpasswdへのユーザー登録 [#l978336f] ユーザーhogehogeで新規に認証用ファイル.htpasswdを作成 # htpasswd -c /home/htdocs/.htpasswd hogehoge ~ ユーザーhogehoge2を既存の認証用ファイル.htpasswdに追加 # htpasswd /home/htdocs/.htpasswd hogehoge2 ~ 「command not found」が出たら # PATH=$PATH:/usr/local/apache2/bin # export PATH ~ *ファイアウォールの設定 [#wda4f7fd] 参考サイト:[[CentOSで自宅サーバー構築 ファイアウォール構築(iptables)>http://centossrv.com/iptables.shtml]] **iptables設定 [#qc0eb70b] +''iptablesの設定用スクリプトを作成'' # vi iptables.sh ~ 下記の通り記述~ 公開するポートのみコメントを外す #!/bin/bash #---------------------------------------# # 設定開始 # #---------------------------------------# # インタフェース名定義 LAN=eth0 #---------------------------------------# # 設定終了 # #---------------------------------------# # 内部ネットワークのネットマスク取得 LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` # 内部ネットワークアドレス取得 LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '` LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK # ファイアウォール停止(すべてのルールをクリア) /etc/rc.d/init.d/iptables stop # デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定 iptables -P INPUT DROP # 受信はすべて破棄 iptables -P OUTPUT ACCEPT # 送信はすべて許可 iptables -P FORWARD DROP # 通過はすべて破棄 # 自ホストからのアクセスをすべて許可 iptables -A INPUT -i lo -j ACCEPT # 内部からのアクセスをすべて許可 iptables -A INPUT -s $LOCALNET -j ACCEPT # 内部から行ったアクセスに対する外部からの返答アクセスを許可 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SYN Cookiesを有効にする # ※TCP SYN Flood攻撃対策 sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf # ブロードキャストアドレス宛pingには応答しない # ※Smurf攻撃対策 sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf # ICMP Redirectパケットは拒否 sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf for dev in `ls /proc/sys/net/ipv4/conf/` do sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf done # Source Routedパケットは拒否 sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf for dev in `ls /proc/sys/net/ipv4/conf/` do sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf done # フラグメント化されたパケットはログを記録して破棄 iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : ' iptables -A INPUT -f -j DROP # 外部とのNetBIOS関連のアクセスはログを記録せずに破棄 # ※不要ログ記録防止 iptables -A INPUT -s ! $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A INPUT -s ! $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A OUTPUT -d ! $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP iptables -A OUTPUT -d ! $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP # 1秒間に4回を超えるpingはログを記録して破棄 # ※Ping of Death攻撃対策 iptables -N LOG_PINGDEATH iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : ' iptables -A LOG_PINGDEATH -j DROP iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH # 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄 # ※不要ログ記録防止 iptables -A INPUT -d 255.255.255.255 -j DROP iptables -A INPUT -d 224.0.0.1 -j DROP # 113番ポート(IDENT)へのアクセスには拒否応答 # ※メールサーバ等のレスポンス低下防止 iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset # ACCEPT_COUNTRY_MAKE関数定義 # 指定された国のIPアドレスからのアクセスを許可するユーザ定義チェイン作成 ACCEPT_COUNTRY_MAKE(){ for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'` do iptables -A ACCEPT_COUNTRY -s $addr -j ACCEPT done } # DROP_COUNTRY_MAKE関数定義 # 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成 DROP_COUNTRY_MAKE(){ for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'` do iptables -A DROP_COUNTRY -s $addr -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_COUNTRY] : ' iptables -A DROP_COUNTRY -s $addr -j DROP done } # IPアドレスリスト取得 . /root/iptables_functions IPLISTGET # 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成 iptables -N ACCEPT_COUNTRY ACCEPT_COUNTRY_MAKE JP # 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する # 中国・韓国・台湾※からのアクセスをログを記録して破棄 # ※全国警察施設への攻撃元上位3カ国(日本・アメリカを除く) # http://www.cyberpolice.go.jp/detect/observation.htmlより iptables -N DROP_COUNTRY DROP_COUNTRY_MAKE CN DROP_COUNTRY_MAKE KR DROP_COUNTRY_MAKE TW iptables -A INPUT -j DROP_COUNTRY #----------------------------------------------------------# # 各種サービスを公開する場合の設定(ここから) # #----------------------------------------------------------# # 外部からのTCP22番ポート(SSH)へのアクセスを日本からのみ許可 # ※SSHサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 22 -j ACCEPT_COUNTRY # 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可 # ※外部向けDNSサーバーを運用する場合のみ #iptables -A INPUT -p tcp --dport 53 -j ACCEPT #iptables -A INPUT -p udp --dport 53 -j ACCEPT # 外部からのTCP80番ポート(HTTP)へのアクセスを許可 # ※Webサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 外部からのTCP443番ポート(HTTPS)へのアクセスを許可 # ※Webサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 外部からのTCP21番ポート(FTP)へのアクセスを日本からのみ許可 # ※FTPサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 21 -j ACCEPT_COUNTRY # 外部からのPASV用ポート(FTP-DATA)へのアクセスを日本からのみ許可 # ※FTPサーバーを公開する場合のみ # ※PASV用ポート60000:60030は当サイトの設定例 #iptables -A INPUT -p tcp --dport 60000:60030 -j ACCEPT_COUNTRY # 外部からのTCP25番ポート(SMTP)へのアクセスを許可 # ※SMTPサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 25 -j ACCEPT # 外部からのTCP465番ポート(SMTPS)へのアクセスを日本からのみ許可 # ※SMTPSサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 465 -j ACCEPT_COUNTRY # 外部からのTCP110番ポート(POP3)へのアクセスを日本からのみ許可 # ※POP3サーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 110 -j ACCEPT_COUNTRY # 外部からのTCP995番ポート(POP3S)へのアクセスを日本からのみ許可 # ※POP3Sサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 995 -j ACCEPT_COUNTRY # 外部からのTCP143番ポート(IMAP)へのアクセスを日本からのみ許可 # ※IMAPサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 143 -j ACCEPT_COUNTRY # 外部からのTCP993番ポート(IMAPS)へのアクセスを日本からのみ許可 # ※IMAPSサーバーを公開する場合のみ #iptables -A INPUT -p tcp --dport 993 -j ACCEPT_COUNTRY # 外部からのUDP1194番ポート(OpenVPN)へのアクセスを日本からのみ許可 # ※OpenVPNサーバーを公開する場合のみ #iptables -A INPUT -p udp --dport 1194 -j ACCEPT_COUNTRY # VPNインタフェース用ファイアウォール設定 # ※OpenVPNサーバーを公開する場合のみ #[ -f /etc/openvpn/openvpn-startup ] && /etc/openvpn/openvpn-startup #----------------------------------------------------------# # 各種サービスを公開する場合の設定(ここまで) # #----------------------------------------------------------# # 拒否IPアドレスからのアクセスはログを記録せずに破棄 # ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと # (/root/deny_ipがなければなにもしない) if [ -s /root/deny_ip ]; then for ip in `cat /root/deny_ip` do iptables -I INPUT -s $ip -j DROP done fi # 上記のルールにマッチしなかったアクセスはログを記録して破棄 iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : ' iptables -A INPUT -j DROP iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : ' iptables -A FORWARD -j DROP # サーバー再起動時にも上記設定が有効となるようにルールを保存 /etc/rc.d/init.d/iptables save # ファイアウォール起動 /etc/rc.d/init.d/iptables start ~ +''設定用スクリプトに実行権限を付加'' # chmod 700 iptables.sh ~ +''設定スクリプト外部関数作成'' # vi iptables_functions ~ 下記の通り記述 # IPアドレスリスト取得関数定義 IPLISTGET(){ # http://nami.jp/ipv4bycc/から最新版IPアドレスリストを取得する wget -q http://nami.jp/ipv4bycc/cidr.txt.gz gunzip cidr.txt.gz # 最新版IPアドレスリストが取得できなかった場合 if [ ! -f cidr.txt ]; then if [ -f /tmp/cidr.txt ]; then # バックアップがある場合はその旨をroot宛にメール通知して処理を打ち切る echo cidr.txt was read from the backup! | mail -s $0 root exit 1 else # バックアップがない場合はその旨をroot宛にメール通知して処理を打ち切る echo cidr.txt not found!|mail -s $0 root exit 1 fi fi # 最新版IPアドレスリストを /tmpへバックアップする /bin/mv cidr.txt /tmp/cidr.txt } ~ **IPアドレスリスト更新チェック [#e11867bb] IPアドレスリストは頻繁に更新されるので、毎日自動でIPアドレスリストの更新有無をチェックし、更新がある場合はファイアウォール設定スクリプトを再起動するようにする。 +''IPアドレスリストチェックスクリプト作成'' # vi /etc/cron.daily/iplist_check.sh ~ 下記の通り記述 #!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # チェック国コード COUNTRY_CODE='JP CN KR TW' # iptables設定スクリプトパス IPTABLES=/root/iptables.sh # iptables設定スクリプト外部関数取り込み . /root/iptables_functions # IPアドレスリスト最新化 rm -f IPLIST.new IPLISTGET for country in $COUNTRY_CODE do if [ -f /tmp/cidr.txt ]; then grep ^$country /tmp/cidr.txt >> IPLIST.new else grep ^$country /tmp/IPLIST >> IPLIST.new fi done # IPアドレスリスト更新チェック diff -q /tmp/IPLIST IPLIST.new > /dev/null 2>&1 if [ $? -ne 0 ]; then /bin/mv IPLIST.new /tmp/IPLIST $IPTABLES > /dev/null else rm -f IPLIST.new fi ~ +''スクリプトに実行権限を付加'' # chmod +x /etc/cron.daily/iplist_check.sh ~ **iptables起動 [#oe124956] +''設定スクリプト実行'' # ./iptables.sh ファイアウォールルールを適用中: [ OK ] チェインポリシーを ACCEPT に設定中filter [ OK ] iptables モジュールを取り外し中 [ OK ] ファイアウォールのルールを /etc/sysconfig/iptables に保存中[ OK ] ファイアウォールルールを適用中: [ OK ] チェインポリシーを ACCEPT に設定中filter [ OK ] iptables モジュールを取り外し中 [ OK ] iptables ファイアウォールルールを適用中: [ OK ] iptables モジュールを読み込み中ip_conntrack_netbios_ns [ OK ] +''iptables自動起動設定'' # chkconfig iptables on ~ *ログローテーション [#ued603c7] -''/etc/logrotate.conf'' の内容 # see "man logrotate" for details # rotate log files weekly weekly ↑毎週ログを置き換える。毎日はdaily、毎月はmonthly # keep 4 weeks worth of backlogs rotate 4 ↑※ログを4世代分残す。weeky を指定した場合は4週間という意味 # create new (empty) log files after rotating old ones create ↑※新規ログファイルをローテーションした直後に作成する # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress ↑※圧縮する。デフォルトは圧縮''しない''(コメントアウト) # RPM packages drop log rotation information into this directory include /etc/logrotate.d ↑※各ログファイルの設定がおかれているパスを指定。 このディレクトリに自身で作成したconfを入れておけば良い # no packages own wtmp and btmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here. ~ **設定値 [#ee9ba0f2] -daily or weekly or monthly~ ログのローテーション間隔~ ~ -missingok~ ログファイルがない場合でもエラーにしない~ ~ -rotate n~ n回ローテーションする~ ~ -compress~ ローテーションされたログを圧縮~ ~ -delaycompress~ 次回のログローテーションサイクルになるまで圧縮しない~ ~ -notifempty~ ログファイルが空ならローテートしない~ ~ -create 0644 user group~ ログファイルのパーミッションと所有ユーザの設定~ ~ -copytruncate~ 通常、ローテートするときは、既存のログを移動させた後に新しいログファイルを作る。copytruncateを指定した場合は動作が変わり、ログのコピーした後に、既存のログのサイズを0にする動作になる。ログファイルを閉じないプログラム(rails含む)は、この指定をしないとずっと同じログファイルに書き込みが行われてしまう。コピーしてサイズを0にする少しの間だけログがlostされる。この指定をするとcreateが無効になる(新しいファイルを作らないので)~ ~ -dateext~ ログファイル末尾につく数値の代わりに日付(YYYYMMDD)がつく~ ~ **apache用のログローテーション設定 [#t1c9bfe3] +''設定ファイルの作成'' # vi /etc/logrotate.d/httpd /usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log { weekly rotate 4 missingok sharedscripts postrotate /bin/killall -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null endscript } ~ +''確認''~ ログのローテートを実行し、/var/lib/logrotate.log を見て、ローテートが実行されたかどうか確認する。~ # /usr/sbin/logrotate /etc/logrotate.conf ← ローテート実行 # cat /var/lib/logrotate.status "/usr/local/apache2/logs/access_log" 2011-12-1 ← 設定したログが表示される "/usr/local/apache2/logs/error_log" 2011-12-1 ← 設定したログが表示される ~ **Redmine用のログローテーション設定 [#t1c9bfe3] +''設定ファイルの作成'' # vi /etc/logrotate.d/redmine /home/htdocs/redmine/log/production.log { weekly rotate 4 missingok copytruncate notifempty } ~ +''確認''~ ログのローテートを実行し、/var/lib/logrotate.log を見て、ローテートが実行されたかどうか確認する。~ # /usr/sbin/logrotate /etc/logrotate.conf ← ローテート実行 # cat /var/lib/logrotate.status "/home/htdocs/redmine/log/production.log" 2011-12-1 ← 設定したログが表示される ~ *ランレベル [#g934a7ae] 参考:[[ランレベルとは?(http://www.atmarkit.co.jp)>http://www.atmarkit.co.jp/flinux/rensai/linuxtips/156whatrunlv.html]] | 0 |シャットダウン(システムの停止)|シャットダウンに向かう状態| | 1 |シングルユーザーモード(rootのみ) |シングルユーザモード| | 2 |ネットワークなしのマルチユーザーモード |使用されない| | 3 |通常のマルチユーザーモード(テキストログイン) |標準的な状態| | 4 | 未使用 |使用されない| | 5 | グラフィカルログインによるマルチユーザーモード |GUIでログインする状態| | 6 | システムの再起動 |再起動に向かう状態| ~ httpd の自動起動を on にする場合 # chkconfig httpd on ~ httpd の自動起動を ランレベル3と5のみ on にする場合 chkconfig --level 35 httpd on ~ 現在のランレベルを調べる場合 # runlevel N 3 ←ひとつ前のランレベルは存在せず、現在のランレベルは3。 ~ *バージョン確認 [#m502e11f] **OS [#scb8de06] # cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m **カーネル [#yd9ec247] # uname -a Linux hogehoge 2.6.32-431.5.1.el6.i686 #1 SMP Tue Feb 11 21:56:33 UTC 2014 i686 i686 i386 GNU/Linux **Apache [#b196ccbc] # httpd -v Server version: Apache/2.2.26 (Unix) Server built: Mar 7 2014 17:07:03 または、 # httpd -V Server version: Apache/2.2.26 (Unix) Server built: Mar 7 2014 17:07:03 Server's Module Magic Number: 20051115:33 Server loaded: APR 1.5.0, APR-Util 1.5.3 Compiled using: APR 1.5.0, APR-Util 1.5.3 Architecture: 32-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=128 -D HTTPD_ROOT="/etc/httpd" -D SUEXEC_BIN="/usr/sbin/suexec" -D DEFAULT_PIDLOG="logs/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_LOCKFILE="logs/accept.lock" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf" **OpenSSH [#p4c2c7c7] # ssh -V OpenSSH_6.5p1, OpenSSL 1.0.1e-fips 11 Feb 2013 **Postfix [#y29a1188] # postconf | grep mail_version mail_version = 2.6.6 milter_macro_v = $mail_name $mail_version **OpenSSL [#ha17286b] # openssl version OpenSSL 1.0.1e-fips 11 Feb 2013 **Ruby [#x24fc118] # ruby -v ruby 2.0.0p451 (2014-02-24 revision 45167) [i686-linux] **Subversion [#d961e7d8] # svn --version svn, version 1.8.8 (r1568071) compiled Feb 17 2014, 18:18:15 on i686-pc-linux-gnu Copyright (C) 2013 The Apache Software Foundation. This software consists of contributions made by many people; see the NOTICE file for more information. Subversion is open source software, see http://subversion.apache.org/ 以下のリポジトリアクセス (RA) モジュールが利用できます: * ra_svn : svn ネットワークプロトコルを使ってリポジトリにアクセスするモジュール。 - Cyrus SASL 認証を併用 - 'svn' スキームを操作します * ra_local : ローカルディスク上のリポジトリにアクセスするモジュール。 - 'file' スキームを操作します * ra_serf : Module for accessing a repository via WebDAV protocol using serf. - using serf 1.3.4 - 'http' スキームを操作します - 'https' スキームを操作します **PostgreSQL [#m3ee8d8c] # yum list installed | grep postgres postgresql93.i686 9.3.3-1PGDG.rhel6 @pgdg93 postgresql93-devel.i686 9.3.3-1PGDG.rhel6 @pgdg93 postgresql93-libs.i686 9.3.3-1PGDG.rhel6 @pgdg93 postgresql93-server.i686 または、 # psql -U postgres postgres=# select version(); version ------------------------------------------------------------------------------------------------------- PostgreSQL 9.3.3 on i686-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 32-bit (1 行) postgres=# \quit **yumでの確認 [#p55a370a] # yum list installed または、 # yum list installed | grep XXXX XXXXは調べたいもの。例えばzlibなら、 # yum list installed | grep zlib zlib.i686 1.2.3-29.el6 @anaconda-CentOS-201311271240.i386/6.5 zlib-devel.i686 1.2.3-29.el6 @base ~ # yum list installed とした時に表示されるリストに黄色と赤の色付きで表示されるものがある。 # man yum.conf を参照すると、黄色に関するものは color_list_installed_newer The colorization/highlighting for packages in list/info installed which are newer than the latest available package with the same name and arch. Default is ‘bold,yellow’. See color_list_installed_older for possible values. 赤に関するものは color_list_installed_extra The colorization/highlighting for packages in list/info installed which has no available package with the same name and arch. Default is ‘bold,red’. See color_list_installed_older for possible values. と記載されている。yum.confはデフォルトのまま使用しているので、~ 黄色は「yumが参照しているリポジトリの最新よりも新しいもの。」~ 赤色は「yumが参照しているリポジトリには同じ名前の利用可能なものがない。」~ といったところかな?~ *容量を調べる [#m63f2220] 例えば/etc/httpdディレクトリの使用容量を調べる場合 # du -h /etc/httpd 76K /etc/httpd/conf/extra 60K /etc/httpd/conf/original/extra 84K /etc/httpd/conf/original 188K /etc/httpd/conf/proj 12K /etc/httpd/conf/ssl 472K /etc/httpd/conf 8.0K /etc/httpd/conf.d 484K /etc/httpd ←/etc/httpd全体の使用容量
テキスト整形のルールを表示する