优秀的编程知识分享平台

网站首页 > 技术文章 正文

Ubuntu AppArmor 配置 | Ubuntu 24.04 下 MySQL 初始化遇 AppArmor 阻碍

nanyue 2024-12-14 14:16:55 技术文章 8 ℃

前言

AppArmor 是一个易于使用的 Linux 安全模块实现,许多 Linux 发行版(例如 Debian、Ubuntu、OpenSUSE)都附带了 AppArmor。使用 Redhat, CentOS 的用户应该知道 SELINUX。SELINUX 是使用安全上下文(标签)来强制执行访问控制策略,而 AppArmor 是通过为每个程序设置的配置文件(AppArmor profiles)来限制应用程序的功能和权限。

AppArmor 自 Ubuntu 8.04 LTS 起默认安装并加载。一些软件包会安装它们自己的 enforcing 配置文件。下面通过在 Ubuntu 24.04 系统安装 mysql 8 , 简单介绍下 AppArmor。

AppArmor

AppArmor 配置文件有两种操作模式:

  • Complaining/Learning: 允许并记录配置文件违规。这对于测试和开发新配置文件很有用。
  • Enforced/Confined: 除了记录违规行为外,还强制执行配置文件策略。

AppArmor 常用命令

apparmor-utils 包包含了一些命令行工具,您可以使用它们来更改 AppArmor 的操作模式、查找配置文件的状态、创建新的配置文件等。

apt install apparmor-utils

apparmor_status 用于查看 AppArmor 配置文件的当前状态:

sudo apparmor_status

或者使用 aa-status 查看

sudo aa-status

aa-complain 将配置文件置于 complain 模式:

sudo aa-complain /path/to/bin

aa-enforce 将配置文件置于 enforce 模式:

sudo aa-enforce /path/to/bin

apparmor_parser 用于将配置文件加载到内核中。它还可以使用 -r 选项在修改后重新加载当前已加载的配置文件,以使更改生效。要重新加载配置文件:

sudo apparmor_parser -r /etc/apparmor.d/profile.name

systemctl 可以用来重新加载所有配置文件:

sudo systemctl reload apparmor.service

Mysql initialize 遇到 Apparmor 的问题

Mysql Install

使用 apt 安装 mysqld 8.0

sudo apt install mysql-server -y

安装好之后,直接帮我们初始化和启动数据库

使用的当然也是默认的配置文件和默认参数,mysql datadir 在 /var/lib/mysql

Mysql initialize

如果将 datadir 改成 /data/mysqldata ,然后使用 mysqld --initialize 初始化

root@ip-10-20-3-84:~# mkdir -pv /data/mysqldata 
mkdir: created directory '/data'
mkdir: created directory '/data/mysqldata'
root@ip-10-20-3-84:~# chown -R mysql:mysql /data/mysqldata/
root@ip-10-20-3-84:~# ll -ld /data/mysqldata/
drwxr-xr-x 2 mysql mysql 4096 Nov 17 10:15 /data/mysqldata//

可以看到 mysqld --initialize --user=mysql --datadir=/data/mysqldata执行失败,有OS errno 17 报错

查看 syslog 会看到有关于 AppArmor 阻止应用程序的日志记录。

解决方法

方法一:编辑配置文件,增加对应目录相应权限

查看 mysql-server package 的安装文件,它安装了这个配置文件 /etc/apparmor.d/usr.sbin.mysqld 。

AppArmor 配置文件是位于 /etc/apparmor.d/ 的简单文本文件。这些文件以它们所配置的可执行文件的完整路径命名,将其中的“/”替换为“.”。

查看下 /etc/apparmor.d/usr.sbin.mysqld 内容:

# cat /etc/apparmor.d/usr.sbin.mysqld
# vim:syntax=apparmor
# Last Modified: Tue Feb 09 15:28:30 2016
#include <tunables/global>

/usr/sbin/mysqld {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/user-tmp>
  #include <abstractions/mysql>
  #include <abstractions/winbind>

# Allow system resource access
  /proc/*/status r,
  /sys/devices/system/cpu/ r,
  /sys/devices/system/node/ r,
  /sys/devices/system/node/** r,
  capability sys_resource,
  capability dac_override,
  capability dac_read_search,
  capability setuid,
  capability setgid,

# Allow network access
  network tcp,

  /etc/hosts.allow r,
  /etc/hosts.deny r,

# Allow config access
  /etc/mysql/** r,

# Allow pid, socket, socket lock file access
  /var/run/mysqld/mysqld.pid rw,
  /var/run/mysqld/mysqld.sock rw,
  /var/run/mysqld/mysqld.sock.lock rw,
  /var/run/mysqld/mysqlx.sock rw,
  /var/run/mysqld/mysqlx.sock.lock rw,
  /run/mysqld/mysqld.pid rw,
  /run/mysqld/mysqld.sock rw,
  /run/mysqld/mysqld.sock.lock rw,
  /run/mysqld/mysqlx.sock rw,
  /run/mysqld/mysqlx.sock.lock rw,

# Allow systemd notify messages
  /{,var/}run/systemd/notify w,

# Allow execution of server binary
  /usr/sbin/mysqld mr,
  /usr/sbin/mysqld-debug mr,

# Allow plugin access
  /usr/lib/mysql/plugin/ r,
  /usr/lib/mysql/plugin/*.so* mr,

# Allow error msg and charset access
  /usr/share/mysql/ r,
  /usr/share/mysql/** r,

# Allow data dir access
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,

# Allow data files dir access
  /var/lib/mysql-files/ r,
  /var/lib/mysql-files/** rwk,

# Allow keyring dir access
  /var/lib/mysql-keyring/ r,
  /var/lib/mysql-keyring/** rwk,

# Allow log file access
  /var/log/mysql.err rw,
  /var/log/mysql.log rw,
  /var/log/mysql/ r,
  /var/log/mysql/** rw,

# Allow read access to mecab files
  /var/lib/mecab/dic/ipadic-utf8/** r,

# Allow read access to OpenSSL config
  /etc/ssl/openssl.cnf r,
  # Site-specific additions and overrides. See local/README for details.
  #include <local/usr.sbin.mysqld>
}

在 AppArmor 配置文件中使用的主要有两种规则:

路径条目,详细说明应用程序可以访问文件系统中的哪些文件。

Capability 条目,它们决定了受限进程可以使用的权限。

在 AppArmor 配置文件中,权限标志类似于文件系统的权限,但它们专用于控制程序对文件和资源的访问。以下是 r、w 、k 和 m 的具体含义:

  • r (read): 读取权限。允许程序读取文件或目录的内容。
  • w (write): 写入权限。允许程序修改文件或目录的内容。
  • k (lock): 锁定权限。允许程序对文件进行锁定操作。这在需要对文件进行同步访问时可能是必要的,比如数据库的某些操作。
  • m (map): 映射权限。允许程序将文件映射到内存中,这对于加载共享库和插件时非常重要。

要想 mysql 可以在 /data/mysqldata 初始化,需要修改配置文件 /etc/apparmor.d/usr.sbin.mysqld ,增加 /data/mysqldata 目录权限。

# Allow data files dir access
/data/mysqldata/ r,
/data/mysqldata/** rwk,

修改配置文件,必须重新加载配置文件才生效。

sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
# 或者systemctl reload
sudo systemctl reload apparmor.service

重新加载配置后,mysql 初始化就成功了。

方法二:使用 aa-complain 将它设置 complain 模式

sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld

使用 apparmor_status 或者 aa-status 命令查看状态。

这时候,查看配置文件,发现里面的内容有变化。对于使用 aa-complain 修改的配置文件,即使服务器重启也会生效的。

complain 模式下,在其他目录执行初始化也不会有问题。

方法三:禁用或重新启用配置文件

可以使用 /etc/apparmor.d/disable 目录和 apparmor_parser -R 选项来禁用 usr.sbin.mysqld 配置文件:

sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

要重新启用一个被禁用的配置文件,请删除指向配置文件的符号链接,链接位于/etc/apparmor.d/disable/,然后使用-a选项加载配置文件:

sudo rm /etc/apparmor.d/disable/usr.sbin.mysqld
cat /etc/apparmor.d/usr.sbin.mysqld | sudo apparmor_parser -a

方法四:禁用 AppArmor 并卸载内核模块

sudo systemctl stop apparmor.service
sudo systemctl disable apparmor.service

执行了上面的命令,然后执行 mysql 初始化,你会发现还是会有报错。这时候你用 aa-status 查看 Apparmor 状态是 apparmor module is loaded.并且 /etc/apparmor.d/usr.sbin.mysqld 在 enforce mode.

其实还需要多加一步:重启服务器。

其他尝试

把 /etc/apparmor.d/usr.sbin.mysqld 配置文件挪走,重启 apparmor 服务。再执行 mysql 初始化,还是一样的报错。aa-status 命令查看还是能 /usr/sbin/mysqld 配置文件。。。

总结

AppArmor 是一款强大而灵活的安全工具,为服务器提供额外的防护层。如果您正使用 Ubuntu 服务器,不妨尝试启用 AppArmor,让您的系统更安全。不熟悉的它的话,的确会像 selinux 那样,有很多莫名其妙的错误。

参考链接:

https://documentation.ubuntu.com/server/how-to/security/apparmor/?_ga=2.146867442.496519528.1731725807-87320327.1724726308

https://help.ubuntu.com/community/AppArmor

最近发表
标签列表