前言,很重要
虽然mysql 和 pg都有 黑白名单的能力,但是服务器上依旧要严谨配置iptables、云服务器组等等吧,看环境
系列
https://blog.csdn.net/woaixuejinglzq/article/details/158892875?spm=1011.2124.3001.6209
mysql
-
仅允许特定 IP 访问
假设你有一个用户
myuser,只想让它从 IP 地址192.168.1.100连接:sql-- 如果用户不存在,创建用户并限定主机 CREATE USER 'myuser'@'192.168.1.100' IDENTIFIED BY '你的密码'; -- 如果用户已存在(假设原来是 myuser@'%'),需要删除原来的并重建,或直接修改权限 -- 先查看现有用户 SELECT host, user FROM mysql.user WHERE user = 'myuser'; -- 删除允许所有IP的旧记录(谨慎操作) DROP USER 'myuser'@'%'; -- 新建限定IP的用户 CREATE USER 'myuser'@'192.168.1.100' IDENTIFIED BY '你的密码'; -- 授予权限(例如授予所有权限) GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.100'; FLUSH PRIVILEGES; -
允许一个 IP 段(例如 192.168.1.0/24)访问
MySQL 支持使用通配符:
-
%:匹配任意多个字符 -
_:匹配一个字符
sql-- 允许 192.168.1.0 - 192.168.1.255 整个网段 CREATE USER 'myuser'@'192.168.1.%' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.%'; -- 也可以使用子网掩码格式(MySQL 8.0+ 支持) CREATE USER 'myuser'@'192.168.1.0/255.255.255.0' IDENTIFIED BY '你的密码'; -
-
允许本机访问
sql-- localhost 通常指通过 socket 连接 CREATE USER 'myuser'@'localhost' IDENTIFIED BY '你的密码'; -- 127.0.0.1 指通过 TCP/IP 回环地址连接 CREATE USER 'myuser'@'127.0.0.1' IDENTIFIED BY '你的密码';
验证白名单:
sql
-- 查看所有用户及其允许的 Host
SELECT host, user FROM mysql.user;
pg
改配置 /var/lib/postgresql/data/pg_hba.conf,注意,和上面引用文章的配置不是同一个
就类似这样改
sql
# pg_hba.conf
local all all trust
host appdb appuser 192.168.1.100/32 scram-sha-256
host backup backupuser 192.168.1.101/32 scram-sha-256
host all admin 10.0.0.0/24 cert
-
TYPE(第一列) :
local- 只针对本地Unix域套接字连接(不是TCP/IP) host对应TCP/IP -
DATABASE(第二列) :
all- 匹配所有数据库 -
USER(第三列) :
all- 匹配所有用户 -
address(第四列):如果是local,这一列是METHOND
-
METHOD(第五列) :
trust- 无条件允许连接,无需密码
method常用值补充
password / md5 / scram-sha-256(密码认证)/ trust / reject
-
password: 明文密码传输(不安全) -
md5: MD5加密密码(较安全,但已过时) -
scram-sha-256: 最安全的密码认证方式(PostgreSQL 10+推荐)
perr
-
仅用于
local连接 -
使用操作系统用户名进行认证
-
要求PostgreSQL用户名与操作系统用户名一致
ident
-
通过ident服务器获取客户端操作系统用户名
-
通常与TCP wrappers配合使用
cert
-
使用SSL客户端证书进行认证
-
需要配置SSL
ldap / radius / pam(外部认证)
-
通过LDAP、RADIUS或PAM进行认证
-
适用于企业统一认证环境
sql
host all all 192.168.1.0/24 ldap ldapserver=ldap.example.com
用到的小技巧
先备注一些基础的东西
第四列Address用的CIDR表示法,比如127.0.0.1/32 这是一个ipv4的写法
前面的127.0.0.1就代表ip了,/32则是表示子网掩码长度,也可以说是网络前缀位数
ipv4中,用32位二进制来表达一个ip然后每8位分割,
-
IPv4地址共32位(4个8位二进制数)
-
127.0.0.1的二进制:01111111.00000000.00000000.00000001 -
/32意味着前32位是网络号 → 只有这一个地址
如果写成10.0.0.0/24 就代表10.0.0.0 - 10.0.0.255所有的ip,注意奥**10.0.0.0 10.0.0.255特殊的**,一般不会分配给设备
然后就是说正经技巧了
sql
host all all 192.168.1.1/32 trust
host all all 192.168.1.2/31 trust -- 2-3
host all all 192.168.1.4/30 trust -- 4-7
host all all 192.168.1.8/29 trust -- 8-15
host all all 192.168.1.16/28 trust -- 16-31
host all all 192.168.1.32/27 trust -- 32-63
host all all 192.168.1.64/26 trust -- 64-127
host all all 192.168.1.128/25 trust -- 128-255
这样就可以做到范围表达了,或者用reject来做
sql
-- PostgreSQL按顺序匹配,第一个匹配的规则生效!
-- 所以这样的顺序不对:
host all all 192.168.1.0/24 trust -- 这条会先匹配所有
host all all 192.168.1.0/32 reject -- 永远不会执行
-- 正确的顺序(拒绝在前):
host all all 192.168.1.0/32 reject -- 先拒绝 .0
host all all 192.168.1.0/24 trust -- 再允许其他