【CentOS】cronの自動実行

cronは決められた時刻にコマンドを定期的に実行させるためのデーモンプロセスです。

  • cronの起動確認

    /etc/rc.d/init.d/crond status
    crond (pid  xxxx) を実行中...
    
  • cronの起動

    /etc/rc.d/init.d/crond start
    
  • cronの設定ファイル(設定変更非推奨)

    cat /etc/crontab 
    
    # 「/etc/password」の記述に関係なく、強制的にここで定義されたシェルを利用
    SHELL=/bin/bash
    # パスの設定
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    # cronの実行結果をここで指定されたユーザー宛にメール
    MAILTO=root
    # cronによりプログラム実行されるときのカレントディレクトリ
    HOME=/
    
  • cronへの登録(手動)

    crontab -e
    
    * * * * * プログラム名
    1番目:分(0 - 59)
    2番目:時(0 - 23)
    3番目:日(1 - 31)
    4番目:月(1 - 12)
    5番目:曜日(0 - 6)(日曜日が0) or (sun,mon,tue,wed,thu,fri,sat)
    

    編集が完了すると下記パスにユーザ名のファイルに保存される。

    /var/spool/cron/ユーザ名
    
  • cronへの登録(自動)
    対象ディレクトリに配置するだけで自動実行される。

    /etc/cron.hourly:1時間に1回実行
    /etc/cron.daily:1日に1回実行
    /etc/cron.weekly:1週間に1回実行
    /etc/cron.monthly:1ヶ月に1回実行
    

【CentOS】myDNSへのグローバルIP自動通知

myDNSへのグローバルIPの通知はDiCEで実施していたのですが、
最近はWindowsを立ち上げることが減ってきたので、
CentOS側にシェルを作成して自動通知することに。

【起動条件】
1日1回起動

【通知条件】
(A) 前回通知したグローバルIPと起動時のグローバルIPが異なる場合
または
(B) 前回実行が「ERROR」の場合
または
(C) 前回実行から5日経過している場合

通知条件(A)は「/etc/cron.daily」にシェルを配置することで
システムで自動的に1日1回起動するようにします。
通知条件(B)と(C)はシェルで実装します。

  • シェル作成

    vi /etc/cron.daily/mydns.sh
    
  • シェル内容

    #!/bin/bash
    
    # 更新時の日付・時刻、IPアドレス、更新結果ログファイル
    CURRENT_IP_FILE='/var/tmp/current_ip.log'
    # 更新時にMyDNS.jpから返されるHTMLファイル
    LOG_FILE='/var/tmp/ip_update.html'
    
    # ieserver.netのグローバルIP確認でグローバルIPを取得
    IP_ADDR_CHK='http://ieserver.net/ipcheck.shtml'
    # myDnsのログインページ
    DDNS_UPDATE="http://www.mydns.jp/login.html"
    USR='myDNSのユーザ名'
    PSW='myDNSのパスワード'
    STATUS='login_status = 1\.'
    
    if [ -f ${CURRENT_IP_FILE} ]; then
        CURRENT=`cat ${CURRENT_IP_FILE}`
        CURRENT_IP=`echo ${CURRENT} | cut -d " " -f 3`
        CURRENT_DT=`echo ${CURRENT} | cut -d " " -f 1-2`
        CURRENT_RTN=`echo ${CURRENT} | cut -d " " -f 4`
    else
        CURRENT_IP='0.0.0.0'
        CURRENT_DT='2000/01/01 00:00:00'
        CURRENT_RTN='ERROR'
    fi
    
    NEW_IP=`wget -q -O - ${IP_ADDR_CHK}`
    NEW_DT=`date +"%Y/%m/%d %H:%M:%S"`
    
    DIFF_DAY=`expr \( \`date -d"${NEW_DT}" +%s\` - \`date -d"${CURRENT_DT}" +%s\` \) / 86400`
    
    if ( [ ${NEW_IP} != "0.0.0.0" ] && [ ${NEW_IP} != ${CURRENT_IP} ] ) \
    || [ ${CURRENT_RTN} = "ERROR" ] \
    || [ ${DIFF_DAY} -gt 5 ]; then
        wget -q --user=${USR} --password=${PSW} -O ${LOG_FILE} ${DDNS_UPDATE}
        if [ $? -eq 0 ] && grep -q "${STATUS}" ${LOG_FILE}; then
            echo "${NEW_DT} ${NEW_IP} OK" > ${CURRENT_IP_FILE}
            MSG="OK"
        else
            echo "${NEW_DT} ${CURRENT_IP} ERROR" > ${CURRENT_IP_FILE}
            MSG="ERROR"
        fi
    fi
    
  • シェル実行権限付与

    chmod 755 /etc/cron.daily/mydns.sh
    

【CentOS】iptables設定

  • iptablesのテーブル概念
    iptablesは下記3つのテーブルを持つ。

    filter:パケットフィルタリング
    nat:IPアドレスの変換
    mangle:IPヘッダの書き換え
    

    filterはssh、http、https等のポートを通したり。
    natはRaspberry PiのOpenVPNでも設定しましたが、
    「10.8.0.0」を「192.168.XXX.XXX」に変換したり。
    mangleは利用したことありませんので、説明省略。

  • iptableの設定確認
    各々の設定内容は下記コマンドで確認する。

    iptables -t テーブル -L
    

    「-t テーブル」を省略すると自動的に「-t filter」と同義になる。

    または下記コマンドで確認する。
    対象テーブルはfilterのみとなる。

    /etc/init.d/iptables status
    
  • iptableの起動

    /etc/init.d/iptables start
    

    または

    service iptables start
    
  • iptableの停止

    /etc/init.d/iptables stop
    

    または

    service iptables stop
    
  • iptablesの設定追加
    現状のままだと外からWordPressにアクセスできないため、
    ルーターのポート80、443をNUCのIPに向け、
    さらにiptablesのfilterテーブルに設定を追加します。

    iptables -I INPUT 5 -p tcp -m tcp --dport 80 -j ACCEPT
    iptables -I INPUT 6 -p tcp -m tcp --dport 443 -j ACCEPT
    service iptables save
    
    -I:チェインの任意の行番号に挿入
    -p:プロトコルを指定(icmp、 tcp、udp、all)
    -m:マッチング条件拡張(今回の例でいうと「tcp --dport」でパケットの送信先ポートを指定)
    -j:マッチングした際のターゲット(ACCEPT、 DROP、QUEUE、RETURN、LOG、REJECT等)
    

    チェインはテーブルごとに利用できる範囲があります。

    filter:FORWARD、INPUT、OUTPUT
    nat:PREROUTING、POSTROUTING、OUTPUT
    

    5行目と6行目に設定を追加した理由は、今回の設定を追加前の最終行目(5行目)に
    全ての通信を拒否する設定があるからです。
    iptablesは上から順に設定内容を評価するため、
    全ての通信を拒否する設定より前に許可したいポートの設定をしておく必要があります。

【CentOS】セキュリティ向上その2

  • TCP WrapperによるSSH接続アクセス制御

    SSH接続のセキュリティを高めるため、指定したクライアントのみから
    サーバーにSSH 接続できるようにします。

    vi /etc/hosts.deny
    
    下記内容を追加
    ALL: ALL
    
    vi /etc/hosts.allow
    
    下記内容を追加
    sshd: ALL
    

    書式は「サービス名: IP」です。
    denyは拒否するサービスとIPを指定。
    allowは許可するサービスとIPを指定し、denyより優先。
    ALLは「全て」を表します。

    ただしALLとはいってもLinuxの全てのサービスを拒否するわけではなく、
    サービスのデーモンがTCP Wrapperのライブラリであるlibwrapを
    含んでいるかどうかで決まるそうです。

  • SSH接続設定

    vi /etc/ssh/sshd_config
    
    下記内容のコメントを削除
    # rootでのログイン禁止
    #PermitRootLogin yes
    ↓
    PermitRootLogin yes
    
    # 空パスワード禁止
    #PermitEmptyPasswords no
    ↓
    PermitEmptyPasswords no
    
    下記内容を追加
    # hogeユーザのみログイン許可
    AllowUsers hoge
    
    /etc/rc.d/init.d/sshd restart
    
  • SELinux無効化

    vi /etc/sysconfig/selinux
    
    下記内容を変更
    SELINUX=enforcing
    ↓
    SELINUX=disabled
    
  • バッファオーバーフロー対策

    vi /etc/sysctl.conf
    
    # 下記内容を最終行に追加
    # exec-shield
    kernel.exec-shield = 2
    
  • TeraTermの公開鍵設定
    Raspberry Piと同様なので省略。
    TeraTermで生成した鍵を保存する際は任意の名前に変更できます。
    サーバーの数が複数ある場合、秘密鍵の名前は変えておいた方が管理が楽。

【CentOS】セキュリティ向上その1

  • 作業ユーザ追加

    useradd hoge
    passwd hoge
    
    パスワードを2回入力
    ユーザー hoge のパスワードを変更。
    新しいパスワード:
    新しいパスワードを再入力してください:
    passwd: 全ての認証トークンが正しく更新できました。
    
  • rootになれるユーザへ追加

    usermod -G wheel hoge
    
  • rootになれるユーザの制限

    vi /etc/pam.d/su
    
    下記内容のコメントを解除
    #auth           required        pam_wheel.so use_uid
    ↓
    auth           required        pam_wheel.so use_uid
    

    コメント解除するのはsufficientの方ではなく、requiredの方です。

    vi /etc/login.defs
    
    下記内容を追加
    SU_WHEEL_ONLY yes
    

    visudoコマンドも制御します。

    visudo
    
    下記内容を変更
    # %wheel        ALL=(ALL)       ALL
    ↓
    %wheel        ALL=(ALL)       ALL
    

【CentOS】無線LNA設定

  • 「wpa_supplicant」の設定

    無線LAN設定には「wpa_supplicant」というサービスが必要らしいので、
    インストール有無を確認します。

    rpm -qa | grep -i wpa_supplicant
    

    何も画面に出ない場合はインストールされていません。
    案の定、画面に出てこなかったので、インストールします。

    yum install wpa_supplicant
    

    「wpa_supplicant」の設定ファイルを編集します。

    cp /etc/wpa_supplicant/wpa_supplicant.conf  /etc/wpa_supplicant/wpa_supplicant.conf.org
    wpa_passphrase "SSID" "パスワード" >> /etc/wpa_supplicant/wpa_supplicant.conf
    

    SSIDはルーターの固有のIDを設定します。
    パスワードはルーターの側面とかに貼ってあるKEYを設定します。
    設定内容を確認します。

    cat /etc/wpa_supplicant/wpa_supplicant.conf
    
    ctrl_interface=/var/run/wpa_supplicant
    ctrl_interface_group=wheel
    
    network={
            ssid="SSID"
            #psk="パスワード"
            psk=パスワードが暗号化された文字列
    }
    

    上記内容を変更していきます。

    vi /etc/wpa_supplicant/wpa_supplicant.conf
    
    ctrl_interface=/var/run/wpa_supplicant
    ctrl_interface_group=wheel
    
    network={
            ssid="SSID"
            key_mgmt=WPA-PSK
            proto=WPA WPA2
            pairwise=CCMP TKIP
            group=CCMP TKIP
            psk=パスワードが暗号化された文字列
    }
    

    暗号化される前のパスワードは削除しておきます。
    暗号に関する設定値は2つ設定すると前者が先に有効になり、
    前者が適用できない場合、後者の設定を参照します。

    暗号の組み合わせは5通りかな。
    WEP、WPA-TKIP、WPA-CCMP(AES)、WPA2-TKIP、WPA2-CCMP(AES)
    WEPは暗号強度が弱いので選択肢から除外しました。

    もう1ファイル設定します。

    vi /etc/sysconfig/wpa_supplicant
    
    下記内容を変更
    INTERFACES=""
    ↓
    INTERFACES="-iwlan0"
    
    DRIVERS=""
    ↓
    DRIVERS="-Dwext"
    
  • NIC(wlan0)の設定

    「wpa_supplicant」の設定が完了したので、NICの設定を行います。
    有線LNAで設定したeth0は無効化しておきます。

    vi /etc/sysconfig/network-scripts/ifcfg-eth0
    
    下記内容を変更
    ONBOOT=yes
    ↓
    ONBOOT=no
    

    wlan0に無線LANの設定を行います。

    vi /etc/sysconfig/network-scripts/ifcfg-wlan0
    
    下記内容に変更
    DEVICE=wlan0
    HWADDR=初期設定
    TYPE=Wireless
    UUID=初期設定
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    NETWORK=192.168.XXX.0
    NETMASK=255.255.255.0
    GATEWAY=192.168.XXX.1
    IPADDR=192.168.XXX.AAA
    BROADCAST=192.168.XXX.255
    DNS1=192.168.XXX.1
    ESSID=SSID
    

    有線LANと違うところは「DEVICE」「TYPE」「ONBOOT」「ESSID」の4つ。

  • 「wpa_supplicant」の起動設定

    サーバーが再起動しても自動起動できるようにしておきます。

    vi /etc/rc.d/rc.local
    
    下記内容を最終行に追加
    sevice wpa_supplicant start
    ifup wlan0
    

    自動起動といえば「chkconfig」かと思い、設定してみましたが、
    上手くいかなったので、上記設定でやっています。

    これで無線LAN繋げましたが、重すぎます。
    別端末からTeraTermで接続すると重すぎて入力が遅れて返ってきます。
    有線LANに戻すかしばらく様子見です。

【CentOS】初期設定

  • パッケージ最新化
    最初にyumで利用可能なパッケージを最新化しておきます。

    yum -y update
    
    Loaded plugins: fastestmirror, security
    Determining fastest mirrors
    Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os error was
    14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrorlist.centos.org'"
    Error: Cannot find a valid baseurl for repo: base
    

    DNS1がないためエラーになってました。名前解決できなかった模様。
    DNS1を設定し再度実行すると成功しました。

    最小構成でインストールした分を最新化。

    yum -y groupinstall "Base" "Development tools" "Japanese Support"
    
  • cron導入
    次にcronをインストールし、起動しておきます。

    yum -y install yum-cron
    /etc/rc.d/init.d/yum-cron start
    

    さらにchkconfigでサーバ起動時に自動起動できるように登録しておきます。

    chkconfig yum-cron on
    chkconfig --list yum-cron
    
    yum-cron        0:off   1:off   2:on    3:on    4:on    5:on    6:off
    

    数字のメモ。

    0:システム停止モード
    1:セーフモード
    2:マルチユーザーモード(NFSマウントなし)
    3:X Windows以外のデーモンのほとんどを起動する動作モード
    4:未使用
    5:X Windowsのデーモンも起動する動作モード
    6:システム再起動モード
    

    「/etc/rc.d」を確認すると下記構成。
    init.d ディレクトリ:各機能の起動ファイルあり
    rc[0-6].d ディレクトリ:ランレベルに応じた起動ファイルあり
    rc.local ファイル:起動時に実施したい外部ファイルを指定
    rc ファイル:中身確認してません
    rc.sysinit ファイル:中身確認してません

  • ホストネーム変更
    ホストネームを変更しておきます。

    vi /etc/hosts
    
    下記内容に変更
    localhost.localdomain
    ↓
    任意のホスト名
    
    vi /etc/sysconfig/network
    
    下記内容を追加
    HOSTNAME=任意のホスト名
    

    私の環境ではインストール時にホスト名を入力したので、自動設定されたようです。

  • 文字コード
    文字コードがUTF-8になっていることを確認します。

    cat /etc/sysconfig/i18n
    
    LANG="ja_JP.UTF-8"
    
  • nkfの導入
    nkfで文字コードや改行コードの確認や変換で便利なので導入します。

    yum -y install nkf
    

    インストール後に確認を行います。

    nkf -g /var/log/secure
    
    ASCII (LF)
    

再起動、シャットダウンはRaspberry Piと同じコマンドでした。

【CentOS】有線LAN設定

家庭の事情で無線LANになりそうですが、初期設定を行うまでは
ひとまず有線LANで繋ぐので、有線LANの設定を行います。
NICがちゃんと認識されているか確認。

ifconfig
lo 略
eth0 略
wlan0 略

eth0が有線用、wlan0が無線用。
eth0の設定を行います。

cd /etc/sysconfig/network-scripts
cp ifcfg-eth0 ifcfg-eth0.org
vi ifcfg-eth0
下記内容に変更
DEVICE=eth0
HWADDR=初期設定
TYPE=Ethernet
UUID=初期設定
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
NETWORK=192.168.XXX.0
NETMASK=255.255.255.0
GATEWAY=192.168.XXX.1
IPADDR=192.168.XXX.AAA
BROADCAST=192.168.XXX.255
DNS1=192.168.XXX.1

私の環境ではDNS1の設定がないと動きませんでした。
上記設定を行い、ネットワーク再起動します。

/etc/rc.d/init.d/network restart

これで他の端末からTeraTermで接続できます。

CentOSのネットワークの設定ファイルについてメモ。

  • /etc/sysconfig/network
    共通のネットワーク設定ファイル。
  • /etc/sysconfig/network-scripts/ifcfg-eth[0-9]
    個別のネットワーク設定ファイル。共通のネットワーク設定内容を継承している。
  • /etc/resolv.conf
    DNSサーバのIPを記述するファイル。
    DNS1の設定を行い、ネットワークを再起動すると自動で設定される。
  • /etc/hosts
    IPアドレスとホスト名をマッピングするファイル。
    DNSを参照する前にこっちを参照する。
  • /etc/host.conf
    「/etc/hosts」やDNSのどれから参照するかの順番を定義するファイル。

【CentOS】NUC(DN2820FYKH)にCentOS6.5導入

USBの準備ができたので、CentOS 6.5をインストールします。
起動後にログが出たらF2を押下し、
BIOSのBootOrderのAdvancedを選択します。
UFFIのチェックを外し、LegacyのUSBを選択してEnterを押下すると、
インストールが始まります。

  • 言語
    Japaneseを選択します。
    テキストモードでは日本語表示できないから、英語で続けるとか注意書きが出ますが、
    OKを選択して進めます。
  • キーボード
    jp106を選択します。
  • InstallationMethod
    USBなのでHard driveを選択します。
  • Select Partition
    どのディスクパーティションからインストールするかを選択します。
    下記のような選択肢がありましたが、「/dev/sdb1」を選択。

    /dev/sda1
    /dev/sdb1
    Direcory holding image:ブランク
    

    1つ目がHDD、2つ目がUSBかな。
    ここで1つ目がUSBになっている場合、かつ、
    以降のインストールもテキストモードでインストールする場合、
    インストーラーがブートローダーを自動的に設定するので、
    ブートローダーがUSBに作られてしまうことがあるらしいです。

    私の環境では以降のインストールがグラフィックモードで、
    ブートローダーを選択できたため、問題は発生しませんでした。

グラフィックモードでインストール中は基本デフォルト設定で
変更したのは下記の通り。

  • タイムゾーンの設定
    「システムクロックでUTCを使用」はチェックを外します。
  • CentOSのインストールタイプ
    Minimalと今すぐカスタマイズを選択し、下記の3つをチェックします。
    言語/日本語のサポート
    開発/開発ツール
    ベースシステム/ベース

これでCentOS 6.5がインストール完了です。

【CentOS】NUC(DN2820FYKH)にCentOS6.5導入準備

  • CentOS 6.5の選択
    DN2820FYKHでは、CentOS 7.0のインストール時の動作が怪しいらしく、
    先人が実施済のCentOS 6.5を下記の公式サイトから入手し、インストールします。

    http://wiki.centos.org/Download

    i386は32bit版、x86_64版は64bit版なので、x86_64を選択。
    ミラーサイトがいくつかあるので適当に。
    種類がいくつかあって、「0_README.txt」を読むと違いが確認できます。

    ファイル名用途概要
    CentOS-6.5-x86_64-LiveCD.isoインストールせずにCDから起動用(機能少)
    CentOS-6.5-x86_64-LiveDVD.isoインストールせずにCDから起動用(機能多)
    CentOS-6.5-x86_64-bin-DVD1.isoインストール用(機能多)
    CentOS-6.5-x86_64-bin-DVD2.isoインストール用(追加)DVD1のみでも可
    CentOS-6.5-x86_64-minimal.isoインストール用(機能最少)
    CentOS-6.5-x86_64-netinstall.isoインストール用(ネットワーク)

    「torrent」ファイルはネットワーク共有ソフトを使ってインストールする際に利用、
    「sum」ファイルは正しくダウンロードされたかのチェックに利用なので、無視。
    「CentOS-6.5-x86_64-bin-DVD1.iso」を選択してみました。

  • LiveUSB Creator
    DN2820FYKHにCentOSを導入するにあたり、
    USB光学ドライブあると思い込んでいたら、
    自宅にあったのはUSBフロッピーディスクドライブでした。

    新規にUSB光学ドライブ購入するのも嫌。
    とはいえ、フロッピーじゃどうにもならないので、グーグル先生に聞いてみたところ、
    USBからOSがインストールできると。
    microSDカード8GにCentOSのイメージをツールで焼いて、
    USB接続のSDカードリーダにmicroSDカードをセットして利用しました。

    ツールは「liveusb-creator-3.12.0-setup.exe」を利用しました。
    USBが接続されているドライブと焼き付けるファイルを選択するだけ。

    しかし、ここに罠があってこれで作成したUSBを使ってインストールしても
    最後の最後で下記エラーで失敗します。
    「Unable to read package metadata」

  • Unable to read package metadata 解決策
    原因は一部ファイルが正しいファイル名にならなかったから。

    USBの中を確認すると「repodata」ディレクトリがあり、その中のファイル名を修正します。
    修正対象は拡張子がない8ファイル、「repomd.xml」には修正前のファイル名と修正後のファイル名が
    ちゃんとかかれているので、それを見ながら修正します。

    修正後はgzファイルやxmlファイルになるはず。
    「TRANS.TBL」はゴミファイルなので削除。
    再度インストールを行います。