CentOS Howto

提供:あべたけの覚書
2023年5月11日 (木) 09:02時点におけるT.Abe (トーク | 投稿記録)による版 (ページの作成:「 == 時刻の同期 == 下記のコマンドでOS時刻をntpサーバに同期できる。 <syntaxhighlight lang="bash"> [root@XXXXX ~]# ntpdate ntp.nict.jp </syntaxhighlight> '''ntp.nict.jp''' は日本標準時を供給している [http://www.nict.go.jp/ 独立行政法人情報通信研究機構(NICT)] の公開NTPサーバ。 === 定期的に時刻を同期 === '''ntpdate'''コマンドで時刻同期させても、その後時間の経過とともにOS時刻…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

時刻の同期

下記のコマンドでOS時刻をntpサーバに同期できる。

[root@XXXXX ~]# ntpdate ntp.nict.jp

ntp.nict.jp は日本標準時を供給している 独立行政法人情報通信研究機構(NICT) の公開NTPサーバ。

定期的に時刻を同期

ntpdateコマンドで時刻同期させても、その後時間の経過とともにOS時刻にズレが生じるので、cronで定期的に時刻同期を行い、正確さを保つようにする。cronとは、決められた時刻にコマンドを定期的に実行させるためのデーモンプロセス。

  1. まずは、cronが動作しているかどうか確認。
    [root@XXXXX ~]# /etc/rc.d/init.d/crond status
    crond (pid ****) is running...  ←動作中


  2. 動作していない場合は起動する。
    [root@XXXXX ~]# /etc/rc.d/init.d/crond start
    Starting crond:     [ OK ]


  3. cronの設定を行う。
    [root@XXXXX ~]# crontab -e

    初期状態では何も設定されていない(空欄)ので設定を追加する。

    (例)毎日AM6時に時刻同期を行う場合
     0 6 * * * ntpdate ntp.nict.jp

    (※cronの設定については詳しく説明されたサイトが他にあるので割愛)


設定を終了すると、

crontab: installing new crontab

とコンソールに表示される。

コマンド実行結果のログを残す

コマンド実行時、画面にコマンド実行結果が表示されるが量が多くて表示しきれない場合がある。
例えば 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 オプションを付けると同名ファイルがある場合には上書きせずに追記することができる。

フロッピーのマウント

参考サイト:Linux/CentOS ネットワーク実験室 - 第9話/ファイルシステムの管理

カーネルモジュールのロード
最近のバージョンの OS では、フロッピーのカーネルモジュール(デバイスドライバ)がロードされていない場合があるので、次のコマンドでロードする。

[root@XXXXX ~]# modprobe floppy


  1. マウントポイントのフォルダを作成
    [root@XXXXX ~]# mkdir /mnt/floppy


  2. /etc/fstabを編集する
    [root@XXXXX ~]# vi /etc/fstab
    /dev/fd0                /mnt/floppy             vfat    noauto          0 0    ← この1行を追加


  3. root以外でもmountできるようにする
    [root@XXXXX ~]# visudo
    ~(略)~
    ## Allow root to run any commands anyware
    root     ALL=(ALL)       ALL
    hoge  ALL=(ALL)       ALL        ← この1行を追加


使い方

  • マウント
    # mount /mnt/floppy
    root以外では
    $ sudo mount /mnt/floppy

  • マウント解除
    # umount /mnt/floppy

NASドライブのマウント

NASには共有フォルダとユーザー、パスワードを設定しておく。今回は、
共有フォルダ名:backup, ユーザー名:hoge, パスワード:hogehoge

  1. マウントポイントのフォルダを作成
    [root@XXXXX ~]# mkdir /mnt/backup


  2. /etc/fstabを編集する
    [root@XXXXX ~]# vi /etc/fstab
    
    最後の行に下記を追加
    //100.100.100.100/backup  /mnt/backup             cifs    rw,user=hoge,password=hogehoge 0 0


  3. 使い方
    [root@XXXXX ~]# mount /mnt/backup


バックアップの実行

スクリプトの例

バックアップする環境

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での自動実行

#crontab -e

毎日1時に実行

0 1 * * * /path/backup.sh

日時指定の書式は左から「分、時、日、月、曜日」それにコマンドが続く 上記の例では「1時0分」それ以外が「*」なので毎日実行される。
これが例えば

0 1 1 * * /path/backup.sh

だったら毎月1日の1時0分に実行される。

htpasswdへのユーザー登録

ユーザー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


ファイアウォールの設定

参考サイト:CentOSで自宅サーバー構築 ファイアウォール構築(iptables)

iptables設定

  1. iptablesの設定用スクリプトを作成。
    # vi iptables.sh
    
  2. 下記の通り記述。公開するポートのみコメントを外す。
    #!/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
    
  3. 設定用スクリプトに実行権限を付加
    # chmod 700 iptables.sh
    
  4. 設定スクリプト外部関数作成
    # vi iptables_functions
    
  5. 下記の通り記述。
    # 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アドレスリスト更新チェック

IPアドレスリストは頻繁に更新されるので、毎日自動でIPアドレスリストの更新有無をチェックし、更新がある場合はファイアウォール設定スクリプトを再起動するようにする。

  1. IPアドレスリストチェックスクリプト作成
    # vi /etc/cron.daily/iplist_check.sh
    
  2. 下記の通り記述
    #!/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
    
  3. スクリプトに実行権限を付加
    # chmod +x /etc/cron.daily/iplist_check.sh
    

iptables起動

  1. 設定スクリプト実行
    # ./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  ]
    
  2. iptables自動起動設定
    # chkconfig iptables on
    

ログローテーション

/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.


設定値

  • 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用のログローテーション設定

  1. 設定ファイルの作成
    # 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
    }
    


  2. ログのローテートを実行し、/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用のログローテーション設定

  1. 設定ファイルの作成
    # vi /etc/logrotate.d/redmine
    
    /home/htdocs/redmine/log/production.log {
          weekly
          rotate 4
          missingok
          copytruncate
          notifempty
    }
    


  2. ログのローテートを実行し、/var/lib/logrotate.log を見て、ローテートが実行されたかどうか確認する。
    # /usr/sbin/logrotate /etc/logrotate.conf      ← ローテート実行
    # cat /var/lib/logrotate.status
    "/home/htdocs/redmine/log/production.log" 2011-12-1 ← 設定したログが表示される
    

ランレベル

参考:ランレベルとは?(http://www.atmarkit.co.jp)

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。

バージョン確認

OS

# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m


カーネル

# 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

# 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"<
/pre>
<br/>
===OpenSSH===
<pre>
# ssh -V
OpenSSH_6.5p1, OpenSSL 1.0.1e-fips 11 Feb 2013


Postfix

# postconf | grep mail_version
mail_version = 2.6.6
milter_macro_v = $mail_name $mail_version


OpenSSL

# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013


Ruby

# ruby -v
ruby 2.0.0p451 (2014-02-24 revision 45167) [i686-linux]


Subversion

# 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

# 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

または、

# 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での確認

# 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が参照しているリポジトリには同じ名前の利用可能なものがない。」 といったところかな?

容量を調べる

例えば/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全体の使用容量