Edit
Centos 7

バージョン7から、多くのシステムが変更されているので、ここでは専用ページとしてまとめる。

Edit
ホスト名の変更

# vi /etc/hostname

Edit
Systemd

OSにおける、サービスの登録や起動・停止など、システムの根幹であった、init プログラムが、systemd というプログラムに変わったため、OSの起動が非常に早くなっただけでなく、サービスコマンドもわかりやすく統一された。

操作InitSystemd
起動service sshd startsystemctl start sshd
終了service sshd stopsystemctl stop sshd
強制終了PID探してkill -9systemctl kill -s 9 sshd(pidをsystemdが管理するのでサービス名を指定するだけでよい)
再起動service sshd restartsystemctl restart sshd
設定反映service sshd reloadsystemctl reload sshd
状態取得service sshd statussystemctl status sshd
自動起動を有効chkconfig sshd onsystemctl enable sshd
自動起動を無効chkconfig sshd offsystemctl disable sshd
自動起動の状態確認chkconfig --list sshdsystemctl is-enabled sshd(status でも表示される)
サービス一覧の表示ls /etc/init.dsystemctl --type service

ようするに、以前はサービス毎に、/etc/init.d/に登録及びコントロール用のスクリプトを記述して、フォルダに入れていたが、今後は systemd がそのあたりの一切を面倒みてくれる。ログについても同様に管理されるので、サービス毎にどこにログが吐かれるか分からないような状態も軽減される。

ジャーナル(ログ)コマンド

特定のサービスのログを確認journalctl -u sshd(-f オプションをつけると最新の10件だけ表示)
dmesgの代わりjournalctl -k
ログをJSONで取得journalctl -o(-oオプションはどの出力にも適用可能)

※ジャーナルにおけるログの実態は、/var/log/journal に保存されるが直接は見れない。

シングルユーザーモードに入る

systemctl rescue

マルチユーザーモードに戻る

systemctl default

Edit
新しいサービスの追加

新しいサービスの追加のためのファイルは、/etc/systemd/system に存在する。よって、このフォルダに、<サービス名>.service というファイルで以下のようなファイルを作成する。

<例>

# vi /etc/systemd/system/mysql.service
 [Unit]
 Description=Mysql Service

 [Service]
 Type=simple
 User=mysql
 Group=mysql
 ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=./etc/my.cnf
 TimeoutSec=300
 PrivateTmp=true

 [Install]
 WantedBy=multi-user.target

基本は、unit セクションと、servie セクション、Install セクションにわかれ、unit セクションでは、主にこのサービスがどのような構成でできているか、依存関係を記述する。(サービスの起動順番に影響)また install セクションもほとんど定型文。

Edit
追加したサービスの読み込み

# systemctl --system daemon-reload

Edit
サービスの確認

# systemctl list-unit-files -t service

Edit
Unitについて

上記のサービス登録などが、systemd になったのと合わせて、サービス、マウント、デバイスなどの管理も、新しい unit という概念に統一された。

識別子概要
.serviceサービス。有効化するとサービスが起動するようなもの(systemdで利用)
.target依存関係を明確にするための、unit のグループ化に関する設定(昔は存在しない、起動順番で対応していた)
.mountデバイスをファイルにマウントする(過去は mount コマンドで管理)(fstab から自動生成)
.swapで座椅子を、スワップ領域に指定(過去は mount コマンドで管理)(fstab から自動生成)
.deviceデバイスの管理。引き続き udev で管理。自動生成
.socketソケットの管理。(以前は、xinetd などのツールが管理)

※注意:特に systemd は起動処理を並列に動作させることで、OSの起動を早く行うようになっているため、.target の依存関係(順番関係も)をしっかり定義していないと、まともに起動しない場合があります。.target についての詳細は、systemd詳細 を参照。

Edit
unitの定義ファイルの位置

システム固定の設定ファイル(OS管理関係)

/usr/lib/systemd/system/

管理者のカスタマイズするべきもの

/etc/systemd/system/

これらのフォルダに、各unit の設定ファイルが入るが、前のinit.d と同じ様に、ファイル名が unit 名になる。

※但しリンクで対応したい場合、systemctl enable <service設定ファイル>で登録すること(自動でリンクも貼られる)上記のフォルダに直接リンクを設置すると、場合によって、[Failed to execute operation: Too many levels of symbolic links]という、謎エラーで動作しない場合がある。

Edit
unit操作

前の chkconfig --list と同じサービス一覧

# systemctl list-unit-files

起動しているサービスの一括リロード

# systemctl daemon-reload

Edit
ipアドレスの固定方法

Centos 7では、インターフェイス名が変更されているため、設定ファイルの名前が違っているが、概ね同じ構造をしている。

# ip addr

でインターフェース名(この場合はeno16777736)を確認して、中を下記の様に修正する。

# vi /etc/sysconfig/network-script/ifcfg-eno16777736
...
BOOTPROTO="none"
...
IPADDR="192.168.202.2"
NETMASK="255.255.255.0"
GATEWAY="192.168.202.1"
DNS1="192.168.202.1"
DNS2="192.168.111.1"
DOMAIN=svr.mydomain.com          <- 必要なら

また再起動には、

# systemctl restart NetworkManager
# systemctl restart network

を実行する。

Edit
Firewalldについて

CentOS 7 では、以前のポートセキュリティに使われた、iptables のかわりに、firewalld に置き換えられています。この仕組の特徴は zone と呼ばれる単位毎にセキュリティ設定を行うことで、iptables のように個別毎に設定せずに出来ることが特徴です。

初期登録zone説明
drop外部からのあらゆる接続を破棄する。エラーも返さないため送信側はタイムアウトまで待たされる事になる。
block外部からのあらゆる接続に対し、即時に拒否メッセージを返す。内部から開始した接続は可能。
publicデフォルトのゾーン。外部からの接続のみアクセス可能。
external指定した外部から接続のみアクセス可能。IP マスカレードが有効。
dmz非武装セグメント用。指定した外部から接続のみアクセス可能。
work作業用。指定した外部から接続のみアクセス可能。
homeホーム用。指定した外部から接続のみアクセス可能。
internal内部用。指定した外部から接続のみアクセス可能。
trusted全ての接続が許可される。

Edit
よく利用するコマンド

<状態表示>

# firewall-cmd --state

<現在の許可されているサービス名などの表示(defaultゾーンが表示される)>

# firewall-cmd --list-all

<サービスの登録と削除(defaultゾーンに追加される)>

# firewall-cmd --permanent --add-service=ssh
# firewall-cmd --permanent --remove-service=ssh
# firewall-cmd --get-services

※--permanent を付けないと永続化(ファイルに保存)しない。 ※--zone=publicなど、ゾーン指定での修正が可能

<現在のデフォルトゾーンの変更と確認>

# firewall-cmd --set-default-zone=external
# firewall-cmd --get-default-zone
# firewall-cmd --get-active-zones

<インターフェイスの変更>

# firewall-cmd --zone=public --change-interface=NIC名

※ゾーンの割り当てには--permanentオプションが使えない。よって/etc/sysconfig/network-scripts/ifcfg-NIC名、のファイルに、ZONE=public 等を追記する。

<現在のポート状況の確認>

# firewall-cmd --list-ports
# iptables -L | grep ssh

<設定の更新>

# firewall-cmd --reload

Edit
リッチ言語による複雑な設定

<特定のIPからのみ許可させる>

# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.0/16" port protocol="tcp" port="22" accept

※削除時は -–remove-rich-rule="xxxxxx"

# vi public.xml
※ zoneに追加
 <rule family="ipv4">     <ーここに複数のserviceは記述不可、複数サービスには複数のブロックの記述の必要あり。
   <source address="192.168.0.0/16"/>
   <service name="ssh"/>
   <accept/>
 </rule>

上記2つは同じ。

Edit
リッチ言語のその他の指定

rule family=(ipv4/ipv6)
[ source address =(souce address)[/mask] [invert="true"] ]
[ destination address =(souce address)[/mask] [invert="true"] ]
[ service name=(service) ]
[ port port=(portid) protocol=(protocol) ]
[ forward-port port=(portid) protocol=(protocol) to-port=(portid) to-addr=(address) ]
[ log [ prefix=(prefix) ] [ level=(loglevel) ] [ limit value=(rate)/(duration) ]
[ masquerade ]
[ accept|reject|drop ]

※[] 内は選択自由。| はor を意味する。
※通常 service指定があれば、port 指定は必要無し。
※invert=trueを指定すると、指定したホスト以外となる。

<設定されているリッチ条件の一覧>

# firewall-cmd --list-rich-rules

Edit
設定ファイルの詳細

firewalldでは、まずゾーンファイルを作成し、ソースIPとサービス名を定義する。次にサービスファイルで、サービス名とポート番号を指定する。厳密にはicmp用の設定ファイルもあるがここでは割愛する。

Edit
zoneファイル

zoneファイルフォルダ(/etc/firewalld/zones/)には、最初から public.xml というゾーンファイルが登録されている。基本はこれをコピーして利用すると良いだろう。

<例>

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Local</short>
  <description>For use in Local areas.</description>
  <source address="192.168.0.0/16"/>    <- ゾーンが受け取るIPアドレスの指定
  <service name="ssh"/>                 <- ゾーンで許可されるサービス名
  <service name="http"/>                <- ゾーンで許可されるサービス名
</zone>

これらのIPアドレスや、サービスの記述は複数を記述できる。

Edit
サービスファイル

すでに先で説明したように、サービスファイルフォルダ(/etc/firewalld/services/)に、新しいサービスの設定ファイルを保存します。

<例>

# vi /etc/firewalld/services/http.xml
  <?xml version="1.0" encoding="utf-8"?>
  <service>
    <short>HTTP</short>
    <description>HTTP Protocol</description>
    <port protocol="tcp" port="80"/>
  </service>

Edit
設定ファイルの読み込み

# firewall-cmd --reload

Edit
起動・停止・自動起動・確認

# systemctl status firewalld    ....... 起動中の確認
# systemctl enable firewalld
# systemctl start firewalld
# systemctl stop firewalld
# firewall-cmd --state          ....... 起動中の確認

Edit
コマンドオプション

<zone関係>

firewall-cmd のオプション説明
--list-alldefault zoneの内容表示
--list-all-zones全 zone の内容表示
--get-default-zonedefault zone名の表示
--set-default-zone=publicdefault zoneを設定する
--get-active-zone現在のアクティブzoneを表示する
--zone=public --add-source=192.168.11.0/24指定zoneに指定IPを追加する
--zone=public --change-source=192.168.11.0/24指定zoneの指定IPを変更する
--remove-source=192.168.11.0/24指定IPに適用されているzoneを除去する
--zone=public --list-sources指定zoneに設定されている指定IPの表示

<インターフェイス関係>

firewall-cmd のオプション説明
--remove-interface=eth1インターフェイスに割り振られているzoneを削除する
--zone=public --change-interface=eno1zoneにインターフェイスを関連付ける
--zone=public --query-interface=eno1指定のzoneに指定インターフェイスが設定されているか確認
--get-zone-of-interface=eno1指定インターフェイスに設定されているzoneの表示
--zone=public --list-interfaces指定zoneの割当インターフェイスの表示

<サービス関係>

firewall-cmd のオプション説明
--get-services全サービス名の表示
--list-service --zone=public指定zoneのサービス名の表示
--add-service=http --zone=public指定zoneに指定サービスを追加する
--remove-service=http --zone=public指定zoneから指定サービスを削除する

詳細設定の説明

Edit
設定ファイルの初期位置

設定ファイル名場所
zones/lib/firewalld/zones
services/lib/firewalld/services
icmptypes/lib/firewalld/icmptypes

Edit
iptablesに慣れた人

# iptables-save 

こコマンドで、現在のFirewalld が設定している、パケットコントロールについての情報が、iptables形式で確認できる。

Edit
ICMPタイプの操作

<ICMPタイプの一覧表示>

# firewall-cmd --get-icmptypes

<禁止されているICMPタイプを表示>

# firewall-cmd --list-icmp-blocks

<禁止されているICMPタイプに追加と削除>

# firewall-cmd --add-icmp-block=echo-request

# firewall-cmd --remove-icmp-block=echo-request

※--permanentや、--zone=の追加記述可能。

Edit
ポートフォワーディング

<ポートフォワーディングの設定と解除> TCPの10022番ポートで受け取った通信を、192.168.100.1 の22番ポートへ転送

# firewall-cmd --add-forward-port="port=10022:proto=tcp:toaddr=192.168.100.1:toport=22"
# irewall-cmd -–remove-forward-port="port=10022:proto=tcp:toaddr=192.168.100.1:toport=22"

<ポートフォワーディング情報の表示>

# firewall-cmd --list-forward-ports

※--permanentや、--zone=の追加記述可能。

Edit
ssh brute force attack対策

http://kernhack.hatenablog.com/entry/2015/05/31/173835

<要約>

# firewall-cmd --permanent --direct --add-rule ipv4 filter IN_homenet 0 -p tcp -m tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH --rsource -m comment --comment "SSH Brute-force protection" -j LOG --log-prefix "SSH_brute_force "
# firewall-cmd --permanent --direct --add-rule ipv4 filter IN_homenet 1 -p tcp -m tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH --rsource -m comment --comment "SSH Brute-force protection" -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter IN_homenet 2 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource -m comment --comment "SSH Brute-force protection" -j ACCEPT