数据库安全配置:
默认情况下Mysql只允许本地进入设置,在外网想通过命令行访问mysql,那是没门的,如果需要外部IP连接到mysql,需要向mysql数据库里的“user”表里添加相关授权。
1、grant语法:
grant 权限名(所有的权限用all) on 库名(*全部).表名(*全部) to '要授权的用户名' @ '%' (%表示所有的IP,可以只写一个IP) identified by '密码';
身份检查使用user表(Host, User和Password)3个范围列执行。服务器只有在user表记录的Host和User列匹配客户端主机名和用户名并且提供了正确的密码时才接受连接。
在user表Host值的指定方法:
* Host值可以是主机名或IP号,或’localhost’指出本地主机。
* 你可以在Host列值使用通配符字符“%”和“_”。
* Host值’%’匹配任何主机名,空Host值等价于’%’。它们的含义与LIKE操作符的模式匹配操作相同。例如,’%’的Host值与所有主机名匹配,而’%.mysql.com’匹配mysql.com域的所有主机。
(1). 授权用户root使用密码jb51从任意主机连接到mysql服务器:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'jb51' WITH GRANT OPTION;
flush privileges;
(2).授权用户root使用密码jb51从指定ip为218.12.50.60的主机连接到mysql服务器:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'218.12.50.60' IDENTIFIED BY 'jb51' WITH GRANT OPTION;
flush privileges;
2、对数据库提权漏洞问题:
一、采取数据库系统账号与应用账号分离即创建应用程序需要访问的账号;
二、采取收缩权限并设置指定IP地址可以远程访问数据库;
delete from user where user="root" and host!="localhost";
flush privileges;
grant select,insert,update,delete on databaseName.* to uname @ "10.0.212.122" identified by "youpassword";
flush privileges;
三、对用户密码进行加密保存;
此处使用了md5加密算法实现用户信息使用密文保存,这样带来的好处是运维人员也无法在未经用户授权情况下登陆用户的系统,查看某用户涉密相关信息等
四、防SQL注入,写一个工具类
我的项目:
数据库部署到一台ECS1 , 应用服务器部署一台ECS2 .
数据库授权ip 为 ECS2 , 这样部署应用服务器的代码可以通过
jdbc:mysql://10.1**.*.*:3306/xxxxx?useUnicode=true&characterEncoding=UTF-8
直接连接
查看防火墙开发端口:
vim /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 18080 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 18888 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 8888 -j ACCEPT
#-A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
如果本地要连接正式服务器,因为数据库只允许ECS1来连接,那么本地连接数据库的url就不能直接写
数据库服务器(ECS2)的ip地址,而是通过ssh 打隧道,Xshell 5 这个软件有这个功能:
两种方式登录远程服务器,
一种password,也就是用远程服务器(ECS)的账户名和密码
第二种:Public Key -- > RSA加密,用户名和秘钥来登录
隧道配置:
这样,就相对于本地开了6666这个端口来监听数据库3306,
我们连接数据库的链接就会变成这样:
url=jdbc:mysql://127.0.0.1:6666/databaseName?useUnicode=true&characterEncoding=UTF8