自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

Raspberry Pi 3 Model BにインストールしたCentOS7を実用的な構成に仕立て上げた

も少しあとちょっと!

前回は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 明示的に公開鍵認証を無効化するオプション
Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

アバター画像
Yuta Hayakawa

2016年6月入社。2020年12月より取締役に就任しました。

普段は東京本社で管理職のお仕事したり、広報的役割としてテキスト書いたり動画作ったりするのが最近のお仕事。

自称「社内システムチーム統括」として、社内システムチームの面々を見守りつつ毎日を過ごしています。

プライベート面では、音楽やコンピュータ関連、ゴルハム&ジャンハム関係、ゲーム関係が興味あるポイント。

あと、我が子可愛い。

記事一覧