mysql 和 pg ip 白名单

前言,很重要

虽然mysql 和 pg都有 黑白名单的能力,但是服务器上依旧要严谨配置iptables、云服务器组等等吧,看环境

系列

https://blog.csdn.net/woaixuejinglzq/article/details/158892875?spm=1011.2124.3001.6209

mysql

  1. 仅允许特定 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;
  2. 允许一个 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 '你的密码';
  3. 允许本机访问

    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    -- 再允许其他
相关推荐
TechWayfarer21 小时前
反爬与反欺诈:如何利用IP定位API接口识别代理流量并降低风险
网络·tcp/ip·安全
APguantou21 小时前
NCRE-三级数据库技术-第13章-大规模数据库架构
数据库·数据库架构
前进的李工21 小时前
MySQL用户管理与权限控制指南(含底层架构说明)
开发语言·数据库·sql·mysql·架构
刘~浪地球21 小时前
Redis 从入门到精通(十一):持久化配置
数据库·redis·缓存
正在走向自律1 天前
深度剖析 KES 行标识体系:OID 与 ROWID 核心原理、实战案例及性能优化
数据库·oid·kes·rowid
一直都在5721 天前
MySQL索引优化
android·数据库·mysql
wjp@0011 天前
SQL server导出导入数据
运维·服务器·数据库
脑子加油站1 天前
MySQL8数据库高级特性
数据库·mysql
REDcker1 天前
OpenSSL:C 语言 TLS 客户端完整示例
c语言·网络·数据库
zly35001 天前
centos7 mysql 无法被远程连接
数据库·mysql