も少しあとちょっと!
前回はOS等々の最低限のセットアップをおこなったわけですが……。
実用的に使おうとするなら、もう一手間二手間必要になるわけで……。
今回はそんなアレをやっていきましょう。
なお、今回もRaspberry Pi 3 Model B上で動いているCentOS 7に対してやっていくわけですが……今回はラズパイ固有のアレはないはずです。
まずはユーザ作成だよね〜
いままでずっとrootユーザで処理してきましたが……さすがに……これは……マズイので……。
作業用の一般ユーザをつくりませぅ。
普通に「useradd」で作っていっても良いのですが、個人的にはスクリプトを愛用しているので今回もそれを使うことにします。
そのスクリプトはgistに載っけてあるので、使ってみたいっていう方は勝手にどうぞ。1)99割の人はこんなクソみたいなもの使う必要はないです
まず「/root/script」なんてディレクトリを作ってみまして、その中に先のスクリプトを「usrgrp_add.sh」なんて名前で保存してみるわけですよ。保存したそいつに実行権限なんて付与してみたりしてね。
[root@centos-rpi3 ~]# cd ~ [root@centos-rpi3 ~]# mkdir script [root@centos-rpi3 ~]# cd script/ [root@centos-rpi3 script]# curl 'https://gist.githubusercontent.com/hayakawa/ddccad852d3493eff34e/raw/4497fc1adcc1cb1f26870acab04ae1f0af1bc3f0/usradd.sh' > ./usrgrp_add.sh % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2774 100 2774 0 0 2981 0 --:--:-- --:--:-- --:--:-- 2982 [root@centos-rpi3 script]# chmod 755 ./usrgrp_add.sh [root@centos-rpi3 script]#
んで、スクリプトと同じディレクトリに「group.list」と「user.list」ってファイルを作ると。
group.listの方は「{gid}:{groupname}」ってフォーマットで、1行1グループになるよう書いていけばOK。例えば、こんな感じ。
100:group1 101:group2
user.listって方は「{uid}:{username}:{groupname}」ってフォーマットで、1行1ユーザになるよう書いていけばOK。例えば、こんな感じ。
100:user1:group1 101:user2:group2
その後に、sh ./usrgrp_add.sh
とでもしておけば、いい感じにユーザとグループが作られます。
作業ユーザが公開鍵認証でログインできるようにしよう!
作業ユーザができたので、公開鍵認証でログインできるようにしませぅ。……いちいち、パスワード入力するのダルいし_ノ乙(、ン、)_
最初にパスワード設定して……。
[root@centos-rpi3 script]# passwd user1 ユーザー user1 のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。
「su」で作業ユーザになって、ssh関連のディレクトリやらファイルを作って、公開鍵を所定の方法で格納して……。
[root@centos-rpi3 script]# su - user1 [user1@centos-rpi3 ~]$ mkdir .ssh [user1@centos-rpi3 ~]$ vi ./.ssh/authorized_keys (ここでviを使って公開鍵を追加する) [user1@centos-rpi3 ~]$ chown -R user1.group1 ./.ssh/ [user1@centos-rpi3 ~]$ chmod 700 ./.ssh && chmod 600 ./.ssh/authorized_keys [user1@centos-rpi3 ~]$
この状態で、新規にターミナルエミュレータ2)Macなら「ターミナル」、Winなら「Tera Term」とかとかを起動して、公開鍵でログインできることを確認しましょう。
手元のMacからやってみた例がこちら。パスワード等の入力なしでログインできていますね!
[Mac]$ ssh user1@192.0.2.100 Last login: Wed Aug 3 HH:mm:ss YYYY [user1@centos-rpi3 ~]$
sudoを使えるようにしよう!
基本的には一般ユーザで作業して、必要なときだけrootユーザの権限で作業するのが普通ですよね。
大抵の場合、「sudo」コマンドを使うわけですが……。
[user1@centos-rpi3 ~]$ sudo ls / We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for user1: user1 は sudoers ファイル内にありません。この事象は記録・報告されます。
って感じで拒否られます。
それもそのはず、デフォルトでは「wheel」グループに所属しているかrootユーザ以外は使えないようになっています。
今回は、先ほど作ったグループのうち、「group1」に属する人達もsudoを使えるようにしましょう。
rootユーザで「/etc/sudoers.d」に移動して、適当なファイルを作ります。
[root@centos-rpi3 script]# cd /etc/sudoers.d/ [root@centos-rpi3 sudoers.d]# vi ./corplab
viコマンドで下記のような設定を書き込んでおきます。
%group1 ALL=(ALL) ALL
このあと、「group1」グループに所属しているユーザでログインして、「sudo」コマンドを試してみましょう。うまく設定できていれば、下記のような感じでアレできます。
[user1@centos-rpi3 ~]$ sudo ls / [sudo] password for user1: bin boot boot.bak dev etc home lib lost+found media mnt opt proc root run sbin srv sys tmp usr var [user1@centos-rpi3 ~]$
やったね!
suコマンドも制限しよう!
必要なときだけrootユーザの権限を使うためには、もうひとつ方法があります。
そう、「su」コマンドですね。
こいつはrootユーザのパスワードを知っている必要はありますが、一応制限しておきたいですよねぇ……。
ってことで、rootユーザでおもむろに「/etc/login.defs」をviあたりで開いて……。
[root@centos-rpi3 sudoers.d]# vi /etc/login.defs
ファイルの末尾あたりに下記のような1行を追加しまっす。
SU_WHEEL_ONLY yes
続いて、rootユーザで「/etc/pam.d/su」をviあたりで開いて……。
[root@centos-rpi3 ~]# vi /etc/pam.d/su
下記のようになっている所を……
#auth required pam_wheel.so use_uid
下記のように修正します。先頭の「#」を消すだけですね。
auth required pam_wheel.so use_uid
最後に再起動すれば、設定が反映されるはずです。
[root@centos-rpi3 ~]# shutdown -r now
これで、「wheel」グループに所属していないユーザは「su」を使えなくなる3)とはいえ、「sudo」コマンドさえ使えれば、「sudo su -」みたいなのは普通に使えるので、「su」を許可したいユーザのサブグループに「wheel」グループを指定します。
例えば、「user1」ユーザを「wheel」グループに所属させたいときはこんな感じ。
[root@centos-rpi3 ~]# usermod -aG wheel user1
ためしに、「wheel」グループに所属していないユーザでログインしてsuを使ってみると……。
[user2@centos-rpi3 ~]$ su - パスワード: su: 拒否されたパーミッション
と、失敗してしまいます。
所属しているユーザでログインしてsuを使ってみると……。
[user1@centos-rpi3 ~]$ su - パスワード: 最終ログイン: YYYY/MM/DD (week) HH:mm:ss UTC日時 pts/1 [root@centos-rpi3 ~]#
と、無事にrootユーザになることができましたとさ。
ちなみに今回構築中のサーバでは、「wheel」グループに所属しているユーザは作っていません。必要なら「sudo」コマンドを使う運用4)繰り返しになりますが、必要なら「sudo su -」ができちゃうので。で行きたいと思います。
不要なサービスを停止しよう!
現在起動中のサービスをチェックしましょう。
[user1@centos-rpi3 ~]$ sudo systemctl list-units --type=service UNIT LOAD ACTIVE SUB DESCRIPTION ● auditd.service loaded failed failed Security Auditing Service chronyd.service loaded active running NTP client/server crond.service loaded active running Command Scheduler dbus.service loaded active running D-Bus System Message Bus firewalld.service loaded active running firewalld - dynamic firewall daemon getty@tty1.service loaded active running Getty on tty1 irqbalance.service loaded active running irqbalance daemon ● kdump.service loaded failed failed Crash recovery kernel arming kmod-static-nodes.service loaded active exited Create list of required static device nodes for the current kernel ● network.service loaded failed failed LSB: Bring up/down networking NetworkManager.service loaded active running Network Manager polkit.service loaded active running Authorization Manager postfix.service loaded active running Postfix Mail Transport Agent rhel-dmesg.service loaded active exited Dump dmesg to /var/log/dmesg rhel-readonly.service loaded active exited Configure read-only root support rsyslog.service loaded active running System Logging Service sshd.service loaded active running OpenSSH server daemon systemd-journal-flush.service loaded active exited Flush Journal to Persistent Storage systemd-journald.service loaded active running Journal Service systemd-logind.service loaded active running Login Service systemd-random-seed.service loaded active exited Load/Save Random Seed systemd-readahead-collect.service loaded active exited Collect Read-Ahead Data systemd-readahead-replay.service loaded active exited Replay Read-Ahead Data systemd-remount-fs.service loaded active exited Remount Root and Kernel File Systems systemd-sysctl.service loaded active exited Apply Kernel Variables systemd-tmpfiles-setup-dev.service loaded active exited Create Static Device Nodes in /dev ● systemd-tmpfiles-setup.service loaded failed failed Create Volatile Files and Directories systemd-udev-trigger.service loaded active exited udev Coldplug all Devices systemd-udevd.service loaded active running udev Kernel Device Manager systemd-update-utmp.service loaded active exited Update UTMP about System Boot/Shutdown systemd-user-sessions.service loaded active exited Permit User Sessions systemd-vconsole-setup.service loaded active exited Setup Virtual Console tuned.service loaded active running Dynamic System Tuning Daemon wpa_supplicant.service loaded active running WPA Supplicant daemon LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 34 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'.
……はい。いろいろ出てきたし、failedなサービスもいくつかあるようですが……。
ちなみにシステムが認識しているサービス類の一覧は下記コマンドでチェックできます。
[user1@centos-rpi3 ~]$ systemctl list-unit-files --type=service
ぱっと見、「postfix.service」と「wpa_supplicant.service」は不要そうなので……。
[user1@centos-rpi3 ~]$ sudo systemctl stop postfix [user1@centos-rpi3 ~]$ sudo systemctl disable postfix [user1@centos-rpi3 ~]$ sudo systemctl stop wpa_supplicant [user1@centos-rpi3 ~]$ sudo systemctl disable wpa_supplicant
としておけばよさげ。
これで再起動時に不要なサービスが起動しなくなるはず。
ファイアウォールを設定しよう!
続いてファイアウォールを設定しましょう。CentOS 6の頃は、iptables(Netfilter)でしたが、CentOS 7だとfirewalldですね。5)もっともiptablesを使うようにすることもできますし、firewalldの中身はiptablesが動いてるって話もありますが……
まずはfirewalldが起動しているかをチェックします。
[user1@centos-rpi3 ~]$ systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since 木 1970-01-01 00:00:09 UTC; 46 years 7 months ago Main PID: 214 (firewalld) CGroup: /system.slice/firewalld.service └─214 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
起動してるっぽいですね。
こんな表示になってなければ……。
[user1@centos-rpi3 ~]$ sudo systemctl enable firewalld [user1@centos-rpi3 ~]$ sudo systemctl start firewalld
ってしておけばOKですね。
許可するサービスを指定するぅ
現在のファイアウォール設定がどうなってるかを見てみます。
[user1@centos-rpi3 ~]$ firewall-cmd --list-all public (default, active) interfaces: eth0 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: [user1@centos-rpi3 ~]$
有効なネットワークインタフェースである「eth0」は「public」ってゾーンに所属していて、「dhcpv6-client」と「ssh」が許可されているのが分かります。
許可するサービスは、名称で指定する6)ポートなどは個別の設定ファイル(/usr/lib/firewalld/services/ 配下、ICMP系は/usr/lib/firewalld/icmptypes 配下)に書いてあるにょので、何が指定可能かをみてみませぅ。
[user1@centos-rpi3 ~]$ firewall-cmd --get-services RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https
踏まえた上で……
- dhcpv6-clientはいらないかな〜
- http, httpsは有効にしておきたいかな〜
- 後は必要になったら適時有効にすればいいかな〜
って感じで行きましょうか。
コマンドで設定していきます。
[user1@centos-rpi3 ~]$ sudo firewall-cmd --remove-service=dhcpv6-client --zone=public --permanent success [user1@centos-rpi3 ~]$ sudo firewall-cmd --add-service=http --zone=public --permanent success [user1@centos-rpi3 ~]$ sudo firewall-cmd --add-service=https --zone=public --permanent success
firewalldを再起動7)「–permanent」を指定しないと即時反映されるけど、再起動すると設定が消えるんだったかな?して設定を反映させてみます。
[user1@centos-rpi3 ~]$ sudo firewall-cmd --reload success
設定内容を見てみます。
[user1@centos-rpi3 ~]$ firewall-cmd --list-all public (default, active) interfaces: eth0 sources: services: http https ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: [user1@centos-rpi3 ~]$
はい、バッチリ設定できてますね〜。これでWebサーバとして使うには十分なファイアウォール設定になりましたね(`・ω・´)b8)……なったのか?そもそも、Webサーバにするかどうかも未定なんだけども(;´Д`)
許可するICMPを設定するぅ
現状どうなってるかをチェックします。
[user1@centos-rpi3 ~]$ firewall-cmd --list-icmp-blocks --zone=public [user1@centos-rpi3 ~]$
……はい。フルオープンですね。
指定可能なブツを見てみると……。
[user1@centos-rpi3 ~]$ firewall-cmd --get-icmptypes destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded [user1@centos-rpi3 ~]$
順番に見ていきますか……9)いろいろな攻撃とかに使われるケースも多いICMPなので、これを鵜呑みにせず自分で情報収集とかして、ポリシーを決めてね☆
名称 | 用途 | 設定 |
---|---|---|
destination-unreachable | 宛先到達不可能通知(Type:3) | 許可してもいいかなぁ…… |
echo-reply | エコー応答通知(pingに対する応答、Type:0) | 許可してもいいかなぁ…… |
echo-request | エコー要求通知(ping、Type:8) | 許可してもいいかなぁ…… |
parameter-problem | 不正引数通知(Type:12) | いらないかな…… |
redirect | 経路変更要求通知(Type:5) | いらないかな…… |
router-advertisement | ルーター広告通知(Type:9) | いらないかな…… |
router-solicitation | ルーター請願通知(Type:10) | いらないかな…… |
source-quench | 送出抑制要求通知(Type:3) | いらないかな…… |
time-exceeded | 時間切れ通知(Type:6) | 許可してもいいかなぁ…… |
コレを踏まえて、設定をしていきます。
[user1@centos-rpi3 ~]$ sudo firewall-cmd --add-icmp-block=parameter-problem --zone=public --permanent success [user1@centos-rpi3 ~]$ sudo firewall-cmd --add-icmp-block=redirect --zone=public --permanent success [user1@centos-rpi3 ~]$ sudo firewall-cmd --add-icmp-block=router-advertisement --zone=public --permanent success [user1@centos-rpi3 ~]$ sudo firewall-cmd --add-icmp-block=router-solicitation --zone=public --permanent success [hauser1a@centos-rpi3 ~]$ sudo firewall-cmd --add-icmp-block=source-quench --zone=public --permanent success [user1@centos-rpi3 ~]$
firewalldを再起動して設定を反映させてみます。
[user1@centos-rpi3 ~]$ sudo firewall-cmd --reload success
設定内容を見てみます。
[user1@centos-rpi3 ~]$ firewall-cmd --list-icmp-blocks --zone=public parameter-problem redirect router-advertisement router-solicitation source-quench [user1@centos-rpi3 ~]$
テストしてみるぅ
ここまででサービスとICMPについてファイアウォールの設定をおこなったのでテストしてみましょう。
色々なやり方がありますが、同一セグメント内のマシンからnmapを使ってチェックしてみることにします。
nmapがインストールされた同一セグメント内のマシンから、下記のようにやってみます。10)時間かかるので、急いでるときにやるのはやめよう!
$ $ nmap -sT 192.0.2.100 (中略) Nmap scan report for 192.0.2.100 Host is up (0.0023s latency). Not shown: 999 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 995.32 seconds
というわけで、22番ポート以外は検出されてないですね。
……と、ここまでやって「そりゃsshd以外起動してねぇ11)スキャン対象のマシンで「netstat -alnA inet」とかやってみると立ち上がってるサービスとかが確認できまふんだからあたりまえだよな」ってことに気づきましたとさ。
ntpの設定をしよう!
サーバの時刻がずれているといろいろメンドクサイので、ntpを使って時刻同期をしておきませぅ。
CentOS6まではntpdを使うことが主流だったかと思いますが、CentOS 7ではChronyがデフォルトで入ってます。
設定ファイルは/etc/chrony.confにあるので、コイツを開いてみます。
[user1@centos-rpi3 ~]$ sudo vi /etc/chrony.conf
NTPサーバにする気もないので基本このままでよさそうですが、同期先のNTPサーバは変更しておきます。12)国内のさーばにしておきたいお気持ちなので
# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 0.rhel.pool.ntp.org iburst server 1.rhel.pool.ntp.org iburst server 2.rhel.pool.ntp.org iburst server 3.rhel.pool.ntp.org iburst (中略)
を
# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server ntp.nict.jp iburst (中略)
に書き換えて、chronyを再起動します。
[user1@centos-rpi3 ~]$ sudo systemctl restart chronyd
同期の状態は「sudo chronyc sources」13)「ntpq -p」相当のコマンドで確認できますね。
sshdの設定を調整しよう!
さてさて、最後にsshdの設定をおこなうことにしましょう。
大まかな設定内容としては……
- パスワード認証の無効化
- rootでのログインを無効化
ってことをやります。
まず、「/etc/ssh/sshd_config」をviとかで編集します。
[user1@centos-rpi3 ~]$ sudo vi /etc/ssh/sshd_config
んで、下記のあたりを編集していきます。
PasswordAuthentication yes
を
PasswordAuthentication no
に。
コンフィグの末尾あたりに
PermitRootLogin no
を追記。
最後に、sshdを下記コマンドで再起動します。
[user1@centos-rpi3 ~]$ sudo systemctl restart sshd
この後に、
- rootでログインできないこと
- root以外でもパスワードではログインできないこと
といったあたりを確認すればOKです。
ちなみに後者を確認したいときは……
[Mac]$ ssh -o PubkeyAuthentication=no user1@192.0.2.100
みたいに指定する14)明示的に公開鍵認証を無効化するオプションと確実にチェックできるはず。
こんなもんかー!?
まあ、だいたいこんな感じで設定しておけばOKでしょう!
……というわけで、社内Lab用サーバのベース構成かんせーぃ!
この後は用途に応じていろいろゴニョゴニョしていけばOKかなぁ……。chefとかでここまで自動化できてると楽で良いですねいいですね。
注訳はこちら
↑1 | 99割の人はこんなクソみたいなもの使う必要はないです |
---|---|
↑2 | Macなら「ターミナル」、Winなら「Tera Term」とかとか |
↑3 | とはいえ、「sudo」コマンドさえ使えれば、「sudo su -」みたいなのは普通に使える |
↑4 | 繰り返しになりますが、必要なら「sudo su -」ができちゃうので。 |
↑5 | もっともiptablesを使うようにすることもできますし、firewalldの中身はiptablesが動いてるって話もありますが…… |
↑6 | ポートなどは個別の設定ファイル(/usr/lib/firewalld/services/ 配下、ICMP系は/usr/lib/firewalld/icmptypes 配下)に書いてあるにょ |
↑7 | 「–permanent」を指定しないと即時反映されるけど、再起動すると設定が消えるんだったかな? |
↑8 | ……なったのか?そもそも、Webサーバにするかどうかも未定なんだけども(;´Д`) |
↑9 | いろいろな攻撃とかに使われるケースも多いICMPなので、これを鵜呑みにせず自分で情報収集とかして、ポリシーを決めてね☆ |
↑10 | 時間かかるので、急いでるときにやるのはやめよう! |
↑11 | スキャン対象のマシンで「netstat -alnA inet」とかやってみると立ち上がってるサービスとかが確認できまふ |
↑12 | 国内のさーばにしておきたいお気持ちなので |
↑13 | 「ntpq -p」相当のコマンド |
↑14 | 明示的に公開鍵認証を無効化するオプション |