先週、MongoDBレプリカセット用にAppArmorを構成する方法について説明しました。これは、MySQLベースのシステム用に構成する場合と基本的に同じ概念です。実際、セキュリティは非常に重要です。ビジネスドメインからの情報の不要なデータ収集に対して、データが非常に適切に保護され、カプセル化されていることを確認する必要があるためです。
AppArmorに関するちょっとした歴史
AppArmorは、Immunix Linux 1998–2003で最初に使用されました。当時、AppArmorはサブドメインと呼ばれていました。これは、特定のプログラムのセキュリティプロファイルをさまざまなドメインにセグメント化する機能への参照であり、プログラムは動的に切り替えることができます。 AppArmorはSLESとopenSUSEで最初に利用可能になり、SLES10とopenSUSE10.1でデフォルトで最初に有効になりました。
2005年5月、NovellはImmunixを買収し、SubDomainをAppArmorとしてブランド変更し、Linuxカーネルに含めるためのコードのクリーニングと書き換えを開始しました。 2005年から2007年9月まで、AppArmorはNovellによって保守されていました。 Novellは、現在商標名AppArmorの法的な所有者であるSUSEに買収されました。
AppArmorは、2007年4月にUbuntuに最初に正常に移植/パッケージ化されました。AppArmorはUbuntu 7.10以降のデフォルトパッケージになり、Ubuntu 8.04のリリースの一部として提供され、デフォルトではCUPSのみを保護します。 Ubuntu 9.04以降、MySQLなどのより多くのアイテムにプロファイルがインストールされています。 AppArmorの強化は、ゲストセッション用のプロファイル、libvirt仮想マシン、Evinceドキュメントビューア、およびオプションのFirefoxプロファイルが付属しているため、Ubuntu9.10でも引き続き改善されています。
AppArmorが必要なのはなぜですか?
以前のブログでは、AppArmorの使用法について少し触れました。これは、Linuxセキュリティモジュール(LSM)に実装された強制アクセス制御(MAC)システムです。これは、Ubuntu、Debian(Buster以降)、SUSE、およびその他のディストリビューションなどのシステムでデフォルトで使用され、ほとんど有効になっています。これは、RHEL / CentOS SELinuxに匹敵します。これは、正しく機能するために適切なユーザースペース統合を必要とします。 SELinuxは、すべてのファイル、プロセス、およびオブジェクトにラベルを添付するため、非常に柔軟性があります。ただし、SELinuxの設定は非常に複雑であると考えられており、サポートされているファイルシステムが必要です。一方、AppArmorはファイルパスを使用して動作し、その構成は簡単に調整できます。
AppArmorは、他のほとんどのLSMと同様に、デフォルトの随意アクセス制御(DAC)を置き換えるのではなく、補足します。そのため、プロセスに当初よりも多くの特権を付与することは不可能です。
AppArmorは、アプリケーションごとに特定のルールセットを適用することにより、オペレーティングシステムとアプリケーションを外部または内部の脅威、さらにはゼロデイ攻撃からプロアクティブに保護します。セキュリティポリシーは、個々のアプリケーションがアクセスできるシステムリソースと、どの特権を使用するかを完全に定義します。プロファイルに別の指示がない場合、アクセスはデフォルトで拒否されます。 AppArmorにはいくつかのデフォルトのポリシーが含まれており、高度な静的分析と学習ベースのツールを組み合わせて使用することで、非常に複雑なアプリケーションのAppArmorポリシーを数時間で正常に展開できます。
ポリシーに違反するたびに、システムログにメッセージが表示され、AppArmorは、リアルタイムの違反警告でユーザーに通知するように構成できます。
MySQL用AppArmor
Ubuntu Bionicで実行されているターゲットデータベースノードに対して、ClusterControlを使用してMySQLレプリケーションベースのクラスターをセットアップしました。展開方法については、このブログをさらにフォローするか、このビデオチュートリアルをフォローしてください。 ClusterControlは、デプロイ中にAppArmorをチェックまたは無効にすることに注意してください。以下のように、設定に応じてこれをオフにする必要がある場合があります。
ClusterControlは、現在のAppArmor構成に触れていないことを警告するだけです。 。以下を参照してください:
AppArmorプロファイルの管理
UbuntuでのAppArmorの標準インストールには、プロファイルの効率的な管理に役立つユーティリティは含まれていません。それでは、次のようにこれらのパッケージをインストールしましょう:
$ apt install apparmor-profiles apparmor-utils
インストールしたら、aa-statusコマンドを実行して、システム内のAppArmorのステータスを確認します。私が使用しているノードでは、MySQL8がインストールされていない場合に次の出力があります。
$ aa-status
apparmor module is loaded.
15 profiles are loaded.
15 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/lxc-start
/usr/bin/man
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/connman/scripts/dhclient-script
/usr/lib/snapd/snap-confine
/usr/lib/snapd/snap-confine//mount-namespace-capture-helper
/usr/sbin/tcpdump
lxc-container-default
lxc-container-default-cgns
lxc-container-default-with-mounting
lxc-container-default-with-nesting
man_filter
man_groff
0 profiles are in complain mode.
0 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
ClusterControlを使用してMySQLレプリケーションベースのクラスターをAppArmorでデプロイしているため(つまり、ClusterControlは現在のAppArmor構成に影響を与えません)、デプロイメントにはMySQLプロファイルがあり、 aa-statusを実行しているリスト。
$ aa-status
apparmor module is loaded.
56 profiles are loaded.
19 profiles are in enforce mode.
...
/usr/sbin/mysqld
...
37 profiles are in complain mode.
...
1 processes have profiles defined.
1 processes are in enforce mode.
/usr/sbin/mysqld (31501)
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
-
強制-デフォルト設定。アプリケーションは、プロファイルルールによって制限されたアクションを実行できません。
-
不満-アプリケーションは制限されたアクションを実行でき、アクションはログに記録されます。
-
無効-アプリケーションは制限されたアクションを実行でき、アクションはログに記録されません。
上記の出力に基づいて、プロファイルの不満について詳しく説明しましょう。 AppArmorは、制限なしですべてのタスクを実行できるようにします(ほとんどの場合、不平モードのステータスはプロファイル内の明示的な拒否ルールを強制します)が、それらをイベントとして監査ログに記録します。これは、アプリケーションのプロファイルを作成しようとしているが、アクセスする必要があるものがわからない場合に役立ちます。一方、非制限ステータスは、プログラムが任意のタスクを実行できるようにし、ログに記録しません。これは通常、アプリケーションの開始後にプロファイルがロードされた場合に発生します。つまり、AppArmorからの制限なしに実行されます。この制限されていないステータスの下にリストされているのは、プロファイルを持つプロセスのみであることに注意することも重要です。システムで実行されているが、プロファイルが作成されていないその他のプロセスは、aa-statusの下に表示されません。
AppArmorを無効にした後、セキュリティを強化したり、セキュリティ規制に準拠したい場合は、MySQL自体が提供するこのMySQL8.0プロファイルを使用できます。これを適用するには、次のコマンドを実行するだけです。
$ cat /etc/apparmor.d/usr.sbin.mysqld | sudo apparmor_parser -a
AppArmorプロファイルはデフォルトで/etc/apparmor.d/に保存されていることに注意してください。そのディレクトリにプロファイルを追加することをお勧めします。
AppArmorプロファイルの診断
AppArmorログは、systemdジャーナルの/var/log/syslogおよび/var/log/kern.log(およびauditdがインストールされている場合は/var/log/audit.log)にあります。探す必要があるのは次のとおりです。
-
許可(苦情モードのプロファイルがポリシーに違反した場合にログに記録されます)
-
拒否(強制モードのプロファイルが実際に操作をブロックしたときにログに記録されます)
完全なログメッセージには、拒否された正確なアクセスに関する詳細情報が含まれている必要があります。これを使用して、強制モードでプロファイルをオンにする前にプロファイルを編集できます。
たとえば、
$ grep -i -rn -E 'apparmor=.*denied|apparmor=.*allowed' /var/log/
/var/log/kern.log:503:Jun 18 18:54:09 ubuntu-bionic kernel: [ 664.680141] audit: type=1400 audit(1624042449.006:19): apparmor="DENIED" operation="capable" profile="/usr/sbin/mysqld" pid=30349 comm="mysqld" capability=2 capname="dac_read_search"
Binary file /var/log/journal/877861ee473c4c03ac1512ed369dead1/system.journal matches
/var/log/syslog:1012:Jun 18 18:54:09 ubuntu-bionic kernel: [ 664.680141] audit: type=1400 audit(1624042449.006:19): apparmor="DENIED" operation="capable" profile="/usr/sbin/mysqld" pid=30349 comm="mysqld" capability=2 capname="dac_read_search"
Oracle MySQLによって作成されたプロファイルは、万能のパターンであってはなりません。その場合、たとえば、MySQLインスタンスデータが配置されているデータディレクトリを変更することを決定する場合があります。構成ファイルに変更を適用してMySQLインスタンスを再起動すると、AppArmorはこのアクションを拒否します。たとえば、
$ egrep -i -rn 'apparmor=.*denied|apparmor=.*allowed' /var/log/
/var/log/kern.log:503:Jun 18 18:54:09 ubuntu-bionic kernel: [ 664.680141] audit: type=1400 audit(1624042449.006:19): apparmor="DENIED" operation="capable" profile="/usr/sbin/mysqld" pid=30349 comm="mysqld" capability=2 capname="dac_read_search"
/var/log/kern.log:522:Jun 18 19:46:26 ubuntu-bionic kernel: [ 3801.151770] audit: type=1400 audit(1624045586.822:67): apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mysql-data/mysql.sock.lock" pid=5262 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=1002 ouid=1002
Binary file /var/log/journal/877861ee473c4c03ac1512ed369dead1/system.journal matches
/var/log/syslog:1012:Jun 18 18:54:09 ubuntu-bionic kernel: [ 664.680141] audit: type=1400 audit(1624042449.006:19): apparmor="DENIED" operation="capable" profile="/usr/sbin/mysqld" pid=30349 comm="mysqld" capability=2 capname="dac_read_search"
/var/log/syslog:1313:Jun 18 19:46:26 ubuntu-bionic kernel: [ 3801.151770] audit: type=1400 audit(1624045586.822:67): apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mysql-data/mysql.sock.lock" pid=5262 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=1002 ouid=1002
以前に発生したエラーとともに、/ mysql-dataディレクトリを使用することを決定したが、拒否されたことが追加されました。
変更を適用するには、次のようにします。ファイル/etc/apparmor.d/usr.sbin.mysqldを編集します。あなたはこれらの行を見つけるかもしれません:
# Allow data dir access
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
Those flags such as r, rwk are the so-called access modes. These mean the following:
r - read
w - write -- conflicts with append
k - lock
これで、次のように変更しました:
# Allow data dir access
/mysql-data/ r,
/mysql-data/** rwk,
次に、次のようにプロファイルをリロードします。
$ apparmor_parser -r -T /etc/apparmor.d/usr.sbin.mysqld
$ systemctl restart mysql.service
mysqldを不平モードに設定した場合はどうなりますか?
前述のように、不平モードのステータスは、プロファイル内の明示的な拒否ルールを引き続き適用します。これはたとえば機能しますが:
$ aa-complain /usr/sbin/mysqld
/ usr / sbin/mysqldを文句モードに設定します。
次に、
$ aa-status
apparmor module is loaded.
56 profiles are loaded.
18 profiles are in enforce mode.
...
38 profiles are in complain mode.
...
1 processes have profiles defined.
0 processes are in enforce mode.
1 processes are in complain mode.
/usr/sbin/mysqld (23477)
0 processes are unconfined but have a profile defined.
MySQLを再起動すると、MySQLが実行され、次のようなログファイルが表示されます。
/var/log/syslog:1356:Jun 18 19:58:51 ubuntu-bionic kernel: [ 4545.427074] audit: type=1400 audit(1624046331.098:83): apparmor="ALLOWED" operation="open" profile="/usr/sbin/mysqld" name="/mysql-data/mysql.sock.lock" pid=5760 comm="mysqld" requested_mask="wrc" denied_mask="wrc" fsuid=1002 ouid=1002
/var/log/syslog:1357:Jun 18 19:58:51 ubuntu-bionic kernel: [ 4545.432077] audit: type=1400 audit(1624046331.102:84): apparmor="ALLOWED" operation="mknod" profile="/usr/sbin/mysqld" name="/mysql-data/mysql.sock" pid=5760 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=1002 ouid=1002
/var/log/syslog:1358:Jun 18 19:58:51 ubuntu-bionic kernel: [ 4545.432101] audit: type=1400 audit(1624046331.102:85): apparmor="ALLOWED" operation="mknod" profile="/usr/sbin/mysqld" name="/mysql-data/mysql.pid" pid=5760 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=1002 ouid=1002
And it will work. However, it will probably have issues with networking as it still denies entries as what we have in /etc/apparmor.d/usr.sbin.mysqld. For example, my replica is not able to connect to the primary:
Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 10 retries: 1 message: Host '192.168.40.247' is not allowed to connect to this MySQL server
Last_SQL_Errno: 0
その場合、プロファイルの強制と再読み込みを使用することは、AppArmorでMySQLプロファイルを管理するための効率的で簡単なアプローチです。