网站首页 > 技术文章 正文
前言
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
- 上一篇: 官方教程:如何创建MySql数据库?
- 下一篇: 如何在 Ubuntu 上安装 Zabbix?
猜你喜欢
- 2024-12-14 如何配置全世界最小的 MySQL 服务器
- 2024-12-14 ubuntu(linux)系统使用技巧总结
- 2024-12-14 Linux安装基于rsyslog+loganalyzer的日志系统教程
- 2024-12-14 使用 Nginx 作为 MySQL 的 TCP 负载均衡器
- 2024-12-14 基于Docker一键LNMP(Nginx+MySQL+PHP7/5+Redis)安装程序
- 2024-12-14 mysql的主从搭建以及实现主从切换方法
- 2024-12-14 宝塔面板Linux版本常用命令有哪些?
- 2024-12-14 Ubuntu Linux部署免费HTTPS证书的步骤
- 2024-12-14 WSL 服务自动启动的正确方法
- 2024-12-14 一分钟搭建MySQL InnoDB Cluster高可用集群
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)