バージョン7から、多くのシステムが変更されているので、ここでは専用ページとしてまとめる。
# vi /etc/hostname
OSにおける、サービスの登録や起動・停止など、システムの根幹であった、init プログラムが、systemd というプログラムに変わったため、OSの起動が非常に早くなっただけでなく、サービスコマンドもわかりやすく統一された。
操作 | Init | Systemd |
起動 | service sshd start | systemctl start sshd |
終了 | service sshd stop | systemctl stop sshd |
強制終了 | PID探してkill -9 | systemctl kill -s 9 sshd(pidをsystemdが管理するのでサービス名を指定するだけでよい) |
再起動 | service sshd restart | systemctl restart sshd |
設定反映 | service sshd reload | systemctl reload sshd |
状態取得 | service sshd status | systemctl status sshd |
自動起動を有効 | chkconfig sshd on | systemctl enable sshd |
自動起動を無効 | chkconfig sshd off | systemctl disable sshd |
自動起動の状態確認 | chkconfig --list sshd | systemctl is-enabled sshd(status でも表示される) |
サービス一覧の表示 | ls /etc/init.d | systemctl --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
新しいサービスの追加のためのファイルは、/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 セクションもほとんど定型文。
# systemctl --system daemon-reload
# systemctl list-unit-files -t service
上記のサービス登録などが、systemd になったのと合わせて、サービス、マウント、デバイスなどの管理も、新しい unit という概念に統一された。
識別子 | 概要 |
.service | サービス。有効化するとサービスが起動するようなもの(systemdで利用) |
.target | 依存関係を明確にするための、unit のグループ化に関する設定(昔は存在しない、起動順番で対応していた) |
.mount | デバイスをファイルにマウントする(過去は mount コマンドで管理)(fstab から自動生成) |
.swap | で座椅子を、スワップ領域に指定(過去は mount コマンドで管理)(fstab から自動生成) |
.device | デバイスの管理。引き続き udev で管理。自動生成 |
.socket | ソケットの管理。(以前は、xinetd などのツールが管理) |
※注意:特に systemd は起動処理を並列に動作させることで、OSの起動を早く行うようになっているため、.target の依存関係(順番関係も)をしっかり定義していないと、まともに起動しない場合があります。.target についての詳細は、systemd詳細 を参照。
システム固定の設定ファイル(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]という、謎エラーで動作しない場合がある。
前の chkconfig --list と同じサービス一覧
# systemctl list-unit-files
起動しているサービスの一括リロード
# systemctl daemon-reload
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
を実行する。
CentOS 7 では、以前のポートセキュリティに使われた、iptables のかわりに、firewalld に置き換えられています。この仕組の特徴は zone と呼ばれる単位毎にセキュリティ設定を行うことで、iptables のように個別毎に設定せずに出来ることが特徴です。
初期登録zone | 説明 |
drop | 外部からのあらゆる接続を破棄する。エラーも返さないため送信側はタイムアウトまで待たされる事になる。 |
block | 外部からのあらゆる接続に対し、即時に拒否メッセージを返す。内部から開始した接続は可能。 |
public | デフォルトのゾーン。外部からの接続のみアクセス可能。 |
external | 指定した外部から接続のみアクセス可能。IP マスカレードが有効。 |
dmz | 非武装セグメント用。指定した外部から接続のみアクセス可能。 |
work | 作業用。指定した外部から接続のみアクセス可能。 |
home | ホーム用。指定した外部から接続のみアクセス可能。 |
internal | 内部用。指定した外部から接続のみアクセス可能。 |
trusted | 全ての接続が許可される。 |
<状態表示>
# 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
<特定の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つは同じ。
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
firewalldでは、まずゾーンファイルを作成し、ソースIPとサービス名を定義する。次にサービスファイルで、サービス名とポート番号を指定する。厳密にはicmp用の設定ファイルもあるがここでは割愛する。
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アドレスや、サービスの記述は複数を記述できる。
すでに先で説明したように、サービスファイルフォルダ(/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>
# firewall-cmd --reload
# systemctl status firewalld ....... 起動中の確認 # systemctl enable firewalld # systemctl start firewalld # systemctl stop firewalld # firewall-cmd --state ....... 起動中の確認
<zone関係>
firewall-cmd のオプション | 説明 |
--list-all | default zoneの内容表示 |
--list-all-zones | 全 zone の内容表示 |
--get-default-zone | default zone名の表示 |
--set-default-zone=public | default 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=eno1 | zoneにインターフェイスを関連付ける |
--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から指定サービスを削除する |
設定ファイル名 | 場所 |
zones | /lib/firewalld/zones |
services | /lib/firewalld/services |
icmptypes | /lib/firewalld/icmptypes |
# iptables-save
こコマンドで、現在のFirewalld が設定している、パケットコントロールについての情報が、iptables形式で確認できる。
<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=の追加記述可能。
<ポートフォワーディングの設定と解除> 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=の追加記述可能。
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