云服务器的使用越来越广泛,愈加受到众多企业的青睐,那么,在使用过程时如何更好的做好防护措施呢?小蚁君来说说。
1.随时检查系统安全漏洞,安装系统补丁。不管是Windows还是Linux,操作系统都会有漏洞,及时装上补丁,避免被不法分子恶意利用攻击.
2.安装并升级杀毒软件。目前网络上的病毒越加猖獗,随时会影响到网站服务器的安全,因此,系统要安装上杀毒软件来提前预防病毒的传播,并定期检查升级杀毒软件,自动更新病毒库。
3.定期对服务器数据进行备份。为预防突发的系统故障而导致的数据丢失,平时就要定期对系统数据进行备份,同时,重要的系统文件建议存放在不同的服务器上,以便系统出故障时能将损失降到最低。
4.定期对账号密码进行修改保护。账号和密码保护可以说是服务器系统的第一道防线,目前大部分对服务器的网络攻击都是从密码开始的,一旦不法分子截获了密码,那么前面所做的所有安全防护措施都将失去了作用。
5.关闭不常用的服务和端口。服务器操作系统在安装时,会启动一些不需要的服务,不仅占用了系统的资源,还会增加系统的安全隐患。因此,定期检查系统运行中的软件和服务,没有使用的就关闭掉。
做了那么多,那么要怎么样才能避免一些低级的黑客攻击呢?
小蚁君网络了一些方法以及应对的措施
常见攻击手段
1、针对网站
1.1、SQL注入
sql注入也是老生常谈了,基本上算是常识了,这种手段无非是利用后台漏洞通过URL将关键SQL语句带入程序并在数据库中执行从而造成破坏性结果。常见情况包括后台使用了的致命的字符串拼接,比如在java的jdbc中使用如下写法
String sql = "select * from t_user where username = "+username;
1
如果入参username在url中被换成不怀好意的sql语句或者其他,数据库也就危险了。
localhost:8080/testproj/queryUser?username=;drop%20t_user;
此外,类似的mybatis的${}写法也是同样道理,最好换成#。
1.2、后台框架、协议漏洞
1.3、程序逻辑漏洞
这个就需要黑帽子们比较有耐心,去一点点找出来,举个例子,网站有效性校验。针对数值有效性,前端有进行过滤,但是网站后台没有做参数有效性校验,这时候恶意者使用F12或postman等拼装ajax请求,将dfa或者-1ad这种非法数字发送给后台,健壮性差的程序就很容易报错,异常暴露到页面上,瞬间就能让操作者知道后台使用何种语言何种框架。更严重的可能是利用程序逻辑漏洞做重复提交、越权操作等行为,因此需要开发人员注意。
1.4、CSRF攻击
;password=123456role=1
这个时候浏览器还携带着管理员登录的COOKIE因此该行为得到执行,我就获得了一个管理员用户,当然这么蠢的网站一般是不存在的,这里只是打个比方。
防范手段比较常见的是url携带token进行校验,这种手段还可以防御COOKIE被篡改,盗用等情况,相当的万金油。
1.5、暴力破解
直接采用密码表暴力破解方式强行登录管理员账户,这个没啥技术含量,开发人员做好验证码校验以及恶意攻击校验,频繁请求IP封禁即可。
2、针对服务器
2.1、服务器登录用户、数据库登录用户爆破
黑帽子有多种手段确定后台数据库,比如1.3中直接让后台报错,很容易就发现了后台使用的什么框架,连得啥库。又或是使用nmap 等工具直接开扫,目标服务器暴露3306端口大概率就确定是mysql了。确认了数据库类型以及端口接下来就是采用密码表暴力破解了,很多安全意识差的密码居然还是root,123456之类的,分分钟被暴,而扫到后台服务器22开放端口也可以确认后台服务器使用linux开放ssl登录。所以应对方式有三种:
mysql限制访问IP,这个利用alter user语句就可以做到,root账户尽量只给localhost权限,慎用user@%;
不要使用弱密码,尽量采用字母+数字+特殊字符的密码;
服务器使用放暴力破解服务,可以针对非法访问恶意操作进行锁IP防御。
2.2、服务器端口漏洞
通过nmap很容易扫描到服务器暴露的端口,比如139端口外露,就有大量的手段可以渗透:
net use ipipcContent
nbsp;”” /user:administrator
所以应对手段也很简单,开启防火墙,且只开放有需要的端口,敏感端口如139,445不要外露。
2.3、操作系统漏洞
虽然大部分公司都采用linux作为服务器,相对安全得多,但是还是有不少公司(至少博主见过挺多的)还在使用windows server,大量的漏洞让服务岌岌可危,应对方式也很简单粗暴,该打的补丁就打,不要偷懒。
2.4、木马植入
这个就是黑客直接通过向服务器种植木马,开启后门,取得服务器控制权,应对方式主要以下三点:
1、不要用服务器访问乱七八糟的网站(尤其是公司服务器在国外的,不要想着借来翻墙了,别作死),下载乱七八糟的东西;
2、实体机的移动外设接入前注意杀毒;
3、服务器安装相应安全产品,定期查杀木马,定期更新漏洞补丁;
4、防火墙注意开启,相应端口注意配置。
做到以上几点,基本上中级以下的黑客是进不来了,就算是中高级的黑客也得费一番功夫。当然,如果公司服务器数据涉及资产非常高,建议直接联系小蚁君
使用mysqladmin,这是前面声明的一个特例。 mysqladmin -u root -p password mypasswd 输入这个命令后,需要输入root的原密码,然后root的密码将改为mypasswd。 把命令里的root改为你的用户名,你就可以改你自己的密码了。 UnixLinux: 1.用root或者运行mysqld的用户登录系统; 2.利用kill命令结束掉mysqld的进程; 3.使用--skip-grant-tables参数启动MySQL Server shellmysqld_safe --skip-grant-tables 4.为root@localhost设置新密码 shellmysqladmin -u root flush-privileges password "newpassword" 5.重启MySQL Server mysql修改密码 mysql修改,可在mysql命令行执行如下: mysql -u root mysql mysql Update user SET password=PASSWORD("new password") Where user=’name’; mysql FLUSH PRIVILEGES; mysql QUIT 教你如何将MySQL数据库的密码恢复 因为MySQL密码存储于数据库mysql中的user表中,所以只需要将我windows 2003下的MySQL中的user表拷贝过来覆盖掉就行了。
应该是有人想暴力破解你的密码,做好安全防护,及时修改账户密码,设置的复杂些。查看下是什么IP在操作,禁止它访问
摘至网页链接
常见Mysql配置文件:linux系统下是my.conf,windows环境下是my.ini;
数据库整体安全需求:机密性、完整性、可用性;
下面以mysql 5.7版本为例,介绍mysql常见的安全策略、配置、加固方式等等,有些策略可能只针对Linux操作系统,更多策略可以参考CIS Mysql Benchmark相关文档:
1、操作系统级别安全配置
1.1不要将数据库放在系统分区
Windows系统:直接检查是否将数据库放置在C盘。
Linux系统:
在终端连接上mysql数据库,执行如下命令:
show variables where variable_name = 'datadir';
然后返回shell命令行:
df -h datadir
其中datadir是上一条命令的返回值。
上述命令的返回值不应是/、/var、/usr
1.2使用专用的最小权限账号运行mysql数据库进程
Windows系统:直接打开任务管理器,查看运行mysql进程的操作系统账号,不能为administrator账号。
Linux系统:
Shell命令行运行如下命令:
ps -ef | grep mysql
查看mysql服务的运行账号是否为root或其他高权限账号,如果是的,则需要创建一个非管理员专用账号来运行mysql服务。
1.3禁止使用mysql命令行历史记录
Linux系统:
执行如下命令:
find / -name ".mysql_history"
查看是否存在mysql的历史命令记录文件,如果存在,则需要进行如下加固:
(1)删除.mysql_history文件;
(2)设置环境变量MYSQL_HISTFILE为/dev/null,并添加到shell的初始化脚本中,创建mysql_history到/dev/null的链接:
ln -s /dev/null $HOME/.mysql_history
1.4 确保MYSQL_PWD环境变量未设置敏感信息
Windows系统下进入cmd命令行,使用如下命令:
Set
查看是否设置了环境变量MYSQL_PWD。
Linux系统下使用如下命令:
grep MYSQL_PWD /proc/*/environ
查看MYSQL_PWD环境变量是否设置了敏感信息。
确认那个配置文件或脚本设置了MYSQL_PWD环境变量。
2、安装
2.1使用数据库专用服务器
使用专用的服务器安装mysql服务可以减少mysql服务的攻击面,尽量卸载或删除操作系统上的不必要的应用或服务,减少其他应用的安装可能给mysql的运行带来的安全风险。
2.2 不要复用数据库账号
运行mysql服务的操作系统账号不要用来运行其他应用或服务,这样可以避免其他应用或服务器被攻击给mysql服务带来影响。
2.3 历史命令行密码设置为不可见
使用如下命令:
mysql -u admin -p password
连接mysql数据库服务,退出后查看历史命令,确认password是否为明文。
建议使用如下命令方式登录:
(1)先输入mysql -u admin -p
(2)根据命令行提示输入密码;
而不要在一整条命令中输入密码。
另外要控制mysql配置文件访问权限。
3、文件权限控制
3.1 控制数据目录的访问权限
数据目录是mysql数据库存放的位置,在mysql命令行界面下执行如下命令:
show variables where variable_name = 'datadir';
在终端命令行下执行如下命令:
ls -l datadir/.. | egrep "^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"
其中datadir是第一条命令的执行结果
如果存在问题,linux环境下在终端执行如下命令进行加固:
chmod 700 datadir
chown mysql:mysql datadir
3.2 控制二进制日志文件的权限
mysql的运行会产生很多日志,例如二进制日志、错误日志、慢查询日志等等,Mysql命令行下执行如下命令:
show variables like 'log_bin_basename';
在终端命令行执行如下命令:
ls log_bin_basename.*
对于发现的每一个文件,执行如下命令:
ls -l log_bin_basename.nnnnn | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 log file
chown mysql:mysql log file
3.3 控制错误日志文件的权限
Mysql命令行下执行如下命令:
show variables like 'log_error';
在终端命令行执行如下命令:
ls log_error.*
对于发现的每一个文件,执行如下命令:
ls -l log_error | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 log file
chown mysql:mysql log file
3.4控制慢查询日志文件的权限
Mysql命令行下执行如下命令:
show variables like 'slow_query_log_file';
在终端命令行执行如下命令:
ls slow_query_log_file.*
对于发现的每一个文件,执行如下命令:
ls -l slow_query_log_file | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 log file
chown mysql:mysql log file
3.5控制通用日志文件的权限
Mysql命令行下执行如下命令:
show variables like 'general_log_file';
在终端命令行执行如下命令:
ls general_log_file.*
对于发现的每一个文件,执行如下命令:
ls -l general_log_file | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 log file
chown mysql:mysql log file
3.6控制审计日志文件的权限
Mysql命令行下执行如下命令:
show global variables where variable_name = 'audit_log_file';
在终端执行如下命令:
ls -l audit_log_file | egrep "^-rw[-x]rw[-x][-r][-w][-x][ \t]*[0-9][ \t]*mysql[
\t]*mysql.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 audit_log_file
chown mysql:mysql audit_log_file
4、通用安全
4.1安装最新的补丁
在mysql命令行下查询MySQL的版本:
SHOW VARIABLES WHERE Variable_name LIKE "version";
确认是否由需要安装的补丁包,如果有请安装。
4.2 删除test数据库
Mysql数据库默认安装好后,存在一个名为test的数据库,如果存在,请执行如下命令删除:
Drop database “test”
4.3 确保读取本地文件的参数设置为失效
Mysql命令行下,使用如下命令:
SHOW VARIABLES WHERE Variable_name = 'local_infile';
查看结果是否为OFF。
如果该命令为ON,则数据库用户可以通过LOAD DATA INFILE 或者 SELECT local_file 读取到数据库所在操作系统本地的文件,在这种情况下,需要在mysql配置文件中新增一行:
Local-infile=0;
然后重启数据库服务。
5、权限配置
5.1控制可以访问所有数据库的账号
Mysql数据库下的user表和db表中存放着可以授予数据库用户的权限,确保只有管理员账号才能访问所有数据库。可以访问mysql数据库的用户或许可以查看密码哈希值、修改用户权限等等。
使用如下sql语句:
SELECT user, host FROM mysql.user
WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')
OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y');
SELECT user, host FROM mysql.db WHERE db = 'mysql'
AND ((Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')
OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));
确保返回结果只能是数据库管理员账号。
5.2限制非管理员用户的权限
Mysql.user表中的权限列有:
file_priv:表示是否允许用户读取数据库所在主机的本地文件;
Process:表示是否允许用户查询所有用户的命令执行信息;
Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;
Shutdown_priv:表示用户是否可以关闭数据库;
Create_user_priv:表示用户是否可以创建或删除其他用户;
Grant_priv:表示用户是否可以修改其他用户的权限;
应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:
select user, host from mysql.user where File_priv = 'Y';
select user, host from mysql.user where Process_priv = 'Y';
select user, host from mysql.user where Process_priv = 'Y';
SELECT user, host FROM mysql.user WHERE Shutdown_priv = 'Y';
SELECT user, host FROM mysql.user WHERE Create_user_priv = 'Y';
SELECT user, host FROM mysql.user WHERE Grant_priv = 'Y';
SELECT user, host FROM mysql.db WHERE Grant_priv = 'Y';
确保查询结果中不存在非管理员用户。
如果存在非管理员用户,使用如下命令进行权限回收:
REVOKE FILE ON *.* FROM 'user';
REVOKE PROCESS ON *.* FROM 'user';
REVOKE SUPER ON *.* FROM 'user';
REVOKE SHUTDOWN ON *.* FROM 'user';
REVOKE CREATE USER ON *.* FROM 'user';
REVOKE GRANT OPTION ON *.* FROM user;
其中user为上述查询到的非管理员用户。
5.3合理控制DML/DDL操作授权
DML/DDL语句包括创建或修改数据库结构的权限,例如insert、update、delete、create、drop和alter语句,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。Mysql命令行下执行如下命令:
SELECT User,Host,Db FROM mysql.db WHERE Select_priv='Y'
OR Insert_priv='Y' OR Update_priv='Y' OR Delete_priv='Y' OR Create_priv='Y'
OR Drop_priv='Y' OR Alter_priv='Y';
上述查询到的用户只能对特地的数据库才有相关的权限,使用如下命令进行相关权限的回收:
REVOKE SELECT ON host.database FROM user;
REVOKE INSERT ON host.database FROM user;
REVOKE UPDATE ON host.database FROM user;
REVOKE DELETE ON host.database FROM user;
REVOKE CREATE ON host.database FROM user;
REVOKE DROP ON host.database FROM user;
REVOKE ALTER ON host.database FROM user;
其中user为查询到的未授权的用户,host为相关主机,database为相关数据库。
6、审计和日志
6.1开启错误日志审计功能
错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:
SHOW variables LIKE 'log_error';
确保返回结果为非空,如果为空,需要在mysql数据库配置文件中增加相关配置。
6.2确保日志存放在非系统区域
日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:
SELECT @@global.log_bin_basename;
确保返回结果不是如下路径:/、/var、/usr
6.3关闭原始日志功能
原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:
Log-raw = OFF
7、认证
7.1 Old_passwords环境变量设置
Old_passwords决定了使用PASSWORD()函数和IDENTIFIED BY 、CREATE USER 、GRANT 等语句是时的hash算法:
0 - authenticate with the mysql_native_password plugin
1 - authenticate with the mysql_old_password plugin
2 - authenticate with the sha256_password plugin
设置为mysql_old_password代表弱hash算法,可以快速通过密码字典进行暴力破解。使用如下命令查询相关值:
SHOW VARIABLES WHERE Variable_name = 'old_passwords';
确保返回值不为1。
7.2 secure_auth 选项设置
如果客户端采用Old_passwords发起连接请求,如果服务器端设置了secure_auth,则客户端会拒绝连接请求,可以根据安全需求在配置文件中做相应配置。
7.3 密码保存
确保密码没有明文保存在全局配置文件中。
7.4 确保所有用户都要求使用非空密码登录
执行如下语句查询是否有用户不需要密码即可登录:
SELECT User,host
FROM mysql.user
WHERE (plugin IN('mysql_native_password', 'mysql_old_password')
AND (LENGTH(Password) = 0
OR Password IS NULL))
OR (plugin='sha256_password' AND LENGTH(authentication_string) = 0);
7.5不存在空账号
使用如下命令查询是否存在空账号:
SELECT user,host FROM mysql.user WHERE user = '';
8、网络设置
如果mysql数据库服务器与应用是跨信任域部署的,则需要考虑在数据库服务器与应用服务器之间建立ssl通道进行数据传输,不过这种场景一般很少见,在此不详细描述。
9、数据库备份