以Ubuntu系统为例,使用root用户或具有sudo权限的用户登录MariaDB:
sudo mysql -u root -p
输入密码后进入MariaDB命令行界面。
使用CREATE USER语句创建用户,明确指定主机范围(localhost仅本地访问,%允许远程访问):
-- 创建本地用户(仅localhost可登录)
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
-- 创建远程用户(允许指定IP访问,更安全)
CREATE USER 'remote_user'@'192.168.1.100' IDENTIFIED BY 'RemotePass456!';
避免使用%通配符开放所有远程主机,除非必要。
使用DROP USER语句删除无用用户(需先撤销权限):
-- 删除本地用户
DROP USER 'app_user'@'localhost';
-- 删除远程用户
DROP USER 'remote_user'@'192.168.1.100';
或通过查询mysql.user表删除:
DELETE FROM mysql.user WHERE User='app_user' AND Host='localhost';
FLUSH PRIVILEGES;
```。
## 3. 权限分配:最小权限原则
### 授予权限
使用`GRANT`语句按需分配权限,**避免直接授予`ALL PRIVILEGES`**:
- **特定数据库权限**(推荐):
```sql
-- 授予app_user对mydb数据库的所有权限(本地访问)
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'localhost';
-- 授予remote_user对mydb数据库的SELECT/INSERT权限(远程访问)
GRANT SELECT, INSERT ON mydb.* TO 'remote_user'@'192.168.1.100';
GRANT SELECT ON *.* TO 'monitor_user'@'%';
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'localhost' WITH GRANT OPTION;
分配后需执行FLUSH PRIVILEGES;使更改生效。
使用SHOW GRANTS语句查看用户权限:
-- 查看本地用户权限
SHOW GRANTS FOR 'app_user'@'localhost';
-- 查看远程用户权限
SHOW GRANTS FOR 'remote_user'@'192.168.1.100';
或查询mysql.user表获取所有用户权限概览:
SELECT User, Host, Password FROM mysql.user;
```。
### 撤销权限
使用`REVOKE`语句撤销特定权限,**需精确匹配授予权限的语句**:
```sql
-- 撤销remote_user对mydb数据库的SELECT权限
REVOKE SELECT ON mydb.* FROM 'remote_user'@'192.168.1.100';
-- 撤销app_user对mydb数据库的所有权限
REVOKE ALL PRIVILEGES ON mydb.* FROM 'app_user'@'localhost';
FLUSH PRIVILEGES;
```。
## 4. 安全加固技巧
### 最小权限原则
仅授予用户完成工作所需的最低权限(如应用用户仅需`SELECT`、`INSERT`,无需`DROP`);避免使用`ALL PRIVILEGES`,降低误操作或攻击风险。
### 强化密码策略
- 使用强密码(混合大小写字母、数字、符号,长度≥8位);
- 设置密码过期策略(MariaDB 10.4+支持):
```sql
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
定期提醒用户更换密码。
localhost连接,避免开放%;ufw)限制端口(默认3306):sudo ufw allow from 192.168.1.100 to any port 3306;
/etc/mysql/mariadb.conf.d/50-server.cnf):bind-address = 127.0.0.1
重启服务生效:sudo systemctl restart mariadb。
CREATE ROLE 'read_only_role';
GRANT SELECT ON mydb.* TO 'read_only_role';
GRANT 'read_only_role' TO 'app_user'@'localhost';
角色可批量管理权限,减少重复操作。