LinuxはRedHat系だけじゃなくて、Debian系もありますよってことを書きました。
CentOSの後継としてRedHat系のみを選択するデメリットと、誰かが構築したサーバーも管理するケースはあるので、Debian系も経験値上げましょうという内容です。
同じLinuxとは言え、ディストリビューションが違えば扱い方が異なります。
この記事では、RHEL系とDebian系の違いを紹介します。
全部網羅できないと思うので「これ書いた方がいいんじゃない?」というご意見がありましたらコメントに書いていただくと助かります。
ファイアウォール
Linuxのファイアウォールと言えば、
- iptables
- firewalld
- ufw
の3つがよく知られていると思います。
firewalld(RHEL系)
かつては「iptables」が主流だったのですが、CentOS 7からはfirewalldが実装されるようになりました。
iptables or ufw(Debian系)
DebianやUbuntuではiptablesを使うか、設定が簡単なufw(Uncomplicated FireWall)を利用することができます。
Webサーバーの設定例
例えばWebサーバーの80,443番ポートを利用する場合の設定を見てみましょう。
iptablesの場合
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptablesで設定したルールはメモリー上に保存され、内容が即反映されます。
システムを再起動するとメモリー上のルールは消えるので、ルールをファイルに書き出す必要があります。
DebianやUbuntuでは「netfilter-persistent」というパッケージをインストールして利用するとファイルの書き出しを容易にすることができます。
netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
ルールは、/etc/iptables/{rules.v4,rules.v6}に書き込まれます。
firewalldの場合
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
ルールは、/etc/firewalld/zones/public.xmlに書き込まれます。
設定は以下のようにreloadすることで反映されます。
firewall-cmd --reload
ufwの場合
ufw allow http
ufw allow https
見るからにufwの設定は簡単です。
ルールは、/etc/ufw/{user.rules,user6.rules}に書き込まれます。
設定を有効にするためにはufwがenableであること、reloadして追加したポリシーを再読み込みする必要があります。
ufw reload
特定の送信元からの通信を破棄
頼みもしないのに公開サービスの脆弱性診断をする輩がいます。
サーバーのロードアベレージやプロセス数が急上昇するので監視サーバーからその旨の通知がある訳ですが、「netstat」や「ss」コマンド
ss -atu | sort -h | grep http
ログを確認すると、どの送信元から「ちょっかい」を出されていることが分かります。
時にはネットワークアドレスで遮断することもあるんです。
それぞれのFWで特定の送信元からの通信を遮断する方法を確認してみましょう。
関連記事でwhoisやipcountを使ってネットワークアドレスを求める方法を紹介していますので参考にしてください。
iptablesの場合
iptables -I INPUT -s xxx.xxx.xxx.xxx/16 -j DROP
iptablesはこれだけで通信を破棄することができます。
firewalldの場合
firewall-cmd --zone=drop --add-source=xxx.xxx.xxx.xxx/16
firewalldは、なかなか指が馴染んでくれない。
攻撃を受けている状況で、一刻を争うような時に「-」や「=」を何度も打っているとタイプミスしてコマンド蹴られることが多いんです。
ufwの場合
ufw deny from xxx.xxx.xxx.xxx/16 to any
Apache 1.3系の構文に似ています。
ufwはコマンドが直感的で理解しやすい。これに慣れるとfirewall-cmdを忘れそうです。
パッケージ管理
パッケージに関してはディストリビューションというよりも、「RHEL系」か「Debian系」でパッケージ管理コマンドが異なります。
「install」や「remove」のオプションを指定してインストールや削除を行います。
日常的に使うオプションの中で、パッケージマネージャーによって異なるものを表にしてみます。
パッケージマネージャーの比較
OS | マネージャー | パッケージ更新 | 情報取得 |
---|---|---|---|
RHEL | dnf | upgrade | list |
Debian | apt | update & upgrade | show |
dnf(RHEL系)
CentOS 7まではyumでしたが、CentOS 8からはdnfに変更となりました。
間違って「yum」とタイプしても、以下のように「dnf」にシンボリックリンクが貼られているため同じようにコマンドを受け付けてくれます。
lrwxrwxrwx 1 root root 5 Nov 15 09:28 /usr/bin/yum -> dnf-3
Rocky Linux release 9.1でもyumは使えます。
microdnf(minimal RHEL系)
RHEL系OSのdockerコンテナイメージ「minimal」をpullした場合、パッケージマネージャーはPythonを使わない「microdnf」なのでご注意ください。
apt(Debian系)
debian系のパッケージマネージャーはaptですね。
「apt」または「apt-get」のどちらをタイプするかで世代が分かるようです。
Neo隊長は「気持ちは若い」ので「apt」と打ちます。
ファイル名からパッケージ検索
ソースコードをコンパイルするのに必要なファイルが存在しないためにコンパイルエラーとなることがあります。
出力されたエラーメッセージに必要なファイルが表示されるので、同梱されているパッケージを検索する必要があります。
今回は次のように「curses.h」が見つからなかったと想定してパッケージを検索します。
gcc -O -Wall -o sl sl.c -lncurses
sl.c:41:10: fatal error: curses.h: No such file or directory
41 | #include <curses.h>
| ^~~~~~~~~~
compilation terminated.
make: *** [Makefile:15: sl] Error 1
dnf providesでパッケージ名を検索(RHEL系)
dnf provides \*/curses.h
Last metadata expiration check: 0:06:02 ago on Fri Jan 27 07:33:24 2023.
ncurses-devel-6.2-8.20210508.el9.aarch64 : Development files for the ncurses library
Repo : appstream
Matched from:
Filename : /usr/include/curses.h
Filename : /usr/include/ncurses/curses.h
Filename : /usr/include/ncursesw/curses.h
結果から「ncurses-devel」をインストールすればいいことが分かりました。
dnf install ncurses-devel
apt-fileでパッケージ名を検索(Debian系)
apt-file search curses.h
autoconf-archive: /usr/share/doc/autoconf-archive/html/ax_005fwith_005fcurses.html
latrace: /etc/latrace.d/headers/ncurses.h
libghc-ncurses-doc: /usr/lib/ghc-doc/haddock/ncurses-0.2.16/ncurses.haddock
libncurses-dev: /usr/include/curses.h
libncurses-dev: /usr/include/ncurses.h
libncurses-dev: /usr/include/ncursesw/curses.h
libncurses-dev: /usr/include/ncursesw/ncurses.h
libpython2.7-dbg: /usr/include/python2.7_d/py_curses.h
libpython2.7-dev: /usr/include/python2.7/py_curses.h
libpython3.8-dbg: /usr/include/python3.8d/py_curses.h
libpython3.8-dev: /usr/include/python3.8/py_curses.h
libpython3.9-dbg: /usr/include/python3.9d/py_curses.h
libpython3.9-dev: /usr/include/python3.9/py_curses.h
libslang2-dev: /usr/include/slcurses.h
lua-curses-dev: /usr/include/lua5.1/lua-curses.h
lua-curses-dev: /usr/include/lua5.2/lua-curses.h
lua-curses-dev: /usr/include/lua5.3/lua-curses.h
lua-curses-dev: /usr/share/doc/lua-curses-dev/modules/curses.html
python2.7-doc: /usr/share/doc/python2.7/html/howto/curses.html
python2.7-doc: /usr/share/doc/python2.7/html/library/curses.html
python3.8-doc: /usr/share/doc/python3.8/html/howto/curses.html
python3.8-doc: /usr/share/doc/python3.8/html/library/curses.html
python3.9-doc: /usr/share/doc/python3.9/html/howto/curses.html
python3.9-doc: /usr/share/doc/python3.9/html/library/curses.html
zsh-dev: /usr/include/zsh/zshcurses.h
リストの中から4行目の「libncurses-dev」をインストールすればいいことが分かります。
apt install libncurses-dev
RHEL系とDebian系ではパッケージ名も異なります。
apt-fileがインストールされていない場合はインストールしましょう。
apt install apt-file
スタブリゾルバ
Ubuntu 20.04.5 LTSで「apt update」と「apt upgrade」でインストール済みのパッケージを最新のものにアップグレードしてiptablesの設定。
パッケージを最新版にアップグレードしてファイアウォール設定というのは決まったルーティンです。
iptables設定後、名前解決できない
ソースコードをダウンロードしようとしたところ名前解決できない...
Linuxで名前解決できない場合は「/etc/resolv.conf」をチェックです。
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 127.0.0.53
options edns0 trust-ad
nameserver 127.0.0.53
resolv.confを確認すると「nameserver」に「127.0.0.53」が指定されています。
これは「127.0.0.53:53」で待ち受けし、ローカル向けに名前解決を提供するスタブリゾルバというものです。
Debianで使っていたiptablesポリシーをそのまま流し込んだので名前解決ができなくなったのでした。
スタブリゾルバのメリット
スタブリゾルバはキャッシュ機能があるので、同じ内容の問い合わせであれば自己解決できます。
逆に「nameserver 8.8.8.8」と設定すれば、毎回フルサービスリゾルバの「8.8.8.8」に問い合わせが発生します。
効率を考えるとスタブリゾルバに軍配が上がります。
systemd-resolveコマンドオプション
コマンド(オプション) | 説明 |
---|---|
systemd-resolve --status | DNSの状態を表示 |
systemd-resolve --statistics | リゾルバの統計情報を表示 |
systemd-resolve --reset-statistics | リゾルバの統計情報をリセット |
systemd-resolve --flush-caches | ローカルDNSキャッシュを削除 |
MariaDB 10.4から変更になった認証
CentOSとUbuntuの違いではないのですが、番外編としてMariaDB 10.4から変更となったDBサーバ接続時の認証について触れておきたいと思います。
unix_socket認証
認証にunix_socketを使うのでLinuxのrootユーザーであればパスワード無しでMariaDBのrootで接続できるというものです。
「Linuxのrootユーザーであれば全てにフルアクセスできるんだからMariaDBのアクセスにパスワードいらないよね」ってことのようです。
理解できるのですが... 気分的にイヤかも。
Linuxのrootユーザーであっても、従来通りのパスワード認証をさせたい場合は以下の手順で設定します。
パスワード認証を使う方法
MariaDB(MySQL)サーバーのインストール直後に実施することとして、
- rootのパスワード設定
- パスワードのセットされていないユーザーの削除
を行うと思います。「mysql_secure_installation」を使えば簡単にできますよね。
mysql_secure_installation
Ubuntu 22.04 であればDBのrootパスワードを設定した後に「50-server.cnf」を編集します。
vi /etc/mysql/mariadb.conf.d/50-server.cnf
110行目付近 [mariadb] の下に「unix_socket=OFF」を追記します。
107 # This group is only read by MariaDB servers, not by MySQL.
108 # If you use the same .cnf file for MySQL and MariaDB,
109 # you can put MariaDB-only options here
110 [mariadb]
111 unix_socket=OFF
MariaDBのAuthentication Plugin - Unix Socketの記事によると、「disable_unix_socket」でもunix_socket認証を停止できると書かれています。
設定を反映させるためにMariaDBを再起動します。
systemctl restart mariadb
まとめ
この記事はCentOSを使っていた方がUbuntuに乗り換える際に知っておきたいポイントについて書いてきました。
パッケージマネージャー
パッケージマネージャーはコマンド名の違いはあるものの、オプションについては共通する部分もあってそれほど抵抗は無いと思います。
が若干違うのでこの点は押さえておきましょう!
ファイアウォール
「iptables」「firewalld」「ufw」の3つの操作感を見てもらいました。
一度ufwに慣れてしまうと他の操作を忘れてしまいそうで怖い。
それくらい設定がシンプル。
スタブリゾルバ
systemd-resolvedは名前解決した結果をキャッシュします。
Google Public DNSをresolv.confに直接設定するよりも、DNSクエリーを抑えることができるというメリットがあります。
世の中のDNSサーバーに休息を与えるためにも有効に使いましょう。
コメント