一、Windows
1. 账户管理和认证授权
(1). 账户
a. 默认账户安全
修改位置:控制面板 => 管理工具 => 计算机管理 => 系统工具 => 本地用户和组 => 用户
禁用GUest账户
禁用或删除其他无用账户
按照业务要求,分配账户
b. 定期检查
- 定期删除或锁定与设备运行、维护等与工作无关的账户
c. 不显示用户名
控制面板 => 管理工具 => 本地安全策略 => 本地策略 => 安全选项 => 交互式登录:不显示最后的用户名
(2). 口令
- 控制面板 => 管理工具 => 本地安全策略 => 账户策略
a. 密码复杂度
启用本机组策略中密码必须符合复杂性要求的策略
密码策略 => 密码必须符合复杂性要求
b. 密码最长留存期
账户口令的留存期不应长于90天
密码策略 => 密码最长使用期限
c. 账户锁定策略
- 用户连续认证失败次数超过10次后,锁定该账户
- 账户策略 => 账户锁定策略 => 账户锁定阈值
(3). 授权
- 控制面板 => 管理工具 => 本地安全策略 => 本地策略 => 用户权限分配
a. 远程关机
- 权限只分配给Administrators组
- => 从远端系统强制关机
b. 本地关机
权限只分配给Administrators组
=> 关闭系统
c. 用户权限指派
- 权限只分配给Administrators组
- => 取得文件或其他对象的所有权
d. 授权账户登录
- 只允许指定用户本地登录
- => 允许本地登录
e. 授权账户从网络访问
- => 从网络访问此计算机
2. 日志配置
- 设备应配置日志功能
- 控制面板 => 管理工具 => 本地安全策略 => 本地策略 => 审核策略
(1). 审核事件
a. 审核登录
对用户登录信息进行记录
=> 审核登录事件
b. 审核策略
对Windows系统的审核策略更改,成功 and 失败
=> 审核策略更改
c. 审核对象访问
- 对Windows系统的审核对象访问,成功 and 失败
- => 审核对象访问
d. 审核目录访问
- 对Windows系统的审核目录服务访问,only 失败
- => 审核目录服务器访问
e. 审核特权使用
- 对Windows系统的审核特权使用,成功 and 失败
- => 审核特权使用
f. 审核系统事件
- 对Windows系统的审核系统事件,成功 and 失败
- => 审核系统事件
g. 审核账户管理
- 对Windows系统的审核账户管理,成功 and 失败
- => 审核账户管理
h. 审核过程追踪
- 对Windows系统的盛和进程追踪,only 失败
- => 审核进程追踪
(2). 日志大小
- 至少8192KB,按需要轮询记录日志
- 控制面板 => 管理工具 => 事件查看器 ,进而修改3种日志大小
3. 其他安全配置
(1). 防病毒管理
- 安装企业级防病毒软件
- 并开启病毒库更新及实时防御功能
(2). 屏幕保护
- 从屏保恢复时需要输入密码
- 设置屏保自动开启时间为5分钟
(3). 远程登录空闲时间
- 不活动时间超过15分钟自动断开连接
- 控制面板 => 管理工具 => 本地安全策略 => 本地策略 => 安全选项 =>Microsoft网络服务器:暂停会话前所需的空闲时间数量
(4). 操作系统补丁
二、Linux
1. 账号和口令
(1). 禁用或删除无用账号
userdel [username] #删除不必要账号
passwd -L [username] #锁定账号
passwd -U [username] #解锁账号
(2). 检查特殊账号
a. 空口令账号
①查看
#查看空口令账号
awk -F: '($2=="")' /etc/shadow
#查看UID=0的账号
awk -F: '($3==0)' /etc/passwd
②加固
#为空口令用户设置密码
passwd [username]
b. root权限用户
#查看UID=0的账号
awk -F: '($3==0)' /etc/passwd
(3). 限制用户su
#修改配置文件,添加相应操作
vim /etc/pam.d/su
#添加一行内容,只允许test组用户su到root
auth required pam_wheel.so group=test
(4). 禁止root用户直接登录
#修改配置文件
vi /etc/ssh/sshd_config
#修改为以下内容
PermitRootLogin no
#重启服务
service sshd restart
2. 服务
(1). 关闭不必要的服务
#推荐使用
systemctl disable [服务名]
#老版本系统(Centoss6),不推荐使用
chkconfig --level <init级别> <服务名> off
(2). SSH服务安全
#编辑配置文件
vi /etc/ssh/sshd_config
#不允许root账户直接登录,修改or设置为以下值
PermitRootLogin no
#修改or设置SSH使用的协议版本
Protocol 2
#修改or设置允许密码错误次数(默认为6)
MaxAuthTries 3
#重启服务
service start sshd
3. 日志
#默认系统日志
/var/log/messages
#syslog-ng日志
/etc/syslog-ng/syslog-ng.conf
#默认cron日志
/var/log/cron
#默认安全日志
/var/log/secure
三、中间件
1. Apache服务
(1). 账号设置
- 使用专门的账号和用户来运行Apache服务
a. 创建专用用户
#创建用户组
groupadd apache
#创建用户
useradd apache -g apache
#配置文件httpd.conf添加以下内容,修改Apache服务的运行用户
User apache
Group apache
b. 检查运行用户
#检查httpd.conf配置文件中是否允许非专用账户运行Apache服务,Linux默认apache or nobody,Unix默认Daemon
(2). 授权设置
a. 目录修改权限
非超级用户不能修改该目录中的内容,
/etc/httpd/conf/httpd.conf
#Apache配置文件httpd.conf,修改或添加以下内容 ServerRoot /usr/local/apache
b. 避免未授权访问
- 配置文件和日志文件默认权限均为644
chmod 600 /etc/httpd/conf/httpd.conf
chmod 644 /var/log/httpd/*.log
(3). 日志设置
- 修改配置文件httpd.conf内容,设置日志记录文件、记录内容、记录格式
a. 错误日志
#修改日志级别,notice > warn(默认 )
LogLevel notice
#修改日志的保存位置和文件名
ErrorLog /../logs/error_log
#错误日志传给Syslog时
Errorlog syslog /../logs/error_log
b. 访问日志
#设置日志格式
LogFormat %h %l %u %t \"%r\" %>s %b "%{Accept}i\"%{Referer}i\"\"%{User-Agent}i\""
Combined
#指定保存日志的具体位置、日志格式
CustomLog /../logs/access_log combined #访问日志
(4). 禁止访问外部文件
禁止Apache访问Web目录之外的任何文件
修改httpd.conf配置文件
Order Deny,Allow Deny from all <Directory /> AllowOverride none Require all denied </Directory>
设置可访问的目录
Order Allow,Deny Allow from /var/www #/web为网站根目录 <Directory "/var/www"> AllowOverride None Require all granted </Directory>
默认配置,根据业务调整
Options FollowSysLinks AllowOverride None
(5). 禁止目录列出
避免在Apache列表中显示文件,导致文件泄露
修改httpd.conf配置文件
#Options Indexes FollowSymLinks #删除Indexes Options FollowSymLinks AllowOverride None Order allow,deny Allow from all
重启Apache服务
systemctl restart httpd
(6). 错误页面重定向
防止敏感信息泄露
修改httpd.conf配置文件
ErrorDocument 404 "Forbidden" #自定义显示内容 ErrorDocument 403 /custom404.html #自定义错误页面
重启Apache服务
systemctl restart httpd
(7). 拒绝服务防范
合理设置Session时间(涉及性能调整)
修改httpd.conf配置文件
Timeout 10 #客户端与服务端建立连接前的时间间隔 KeepAlive On keepAliveTimeout 15 #每个session保持时间为15秒
重启Apache服务
systemctl restart httpd
(8). 其他配置
- 修改或添加httpd配置文件内容
a. 隐藏Apache版本号
ServerSignature Off ServerTokens Prod
b. 关闭TRACE功能
#apache版本高于2.0
TraceEnable Off
c. 禁用CGI
存在CGI
直接禁用CGI
不存在CGI
#注释掉cgi-bin目录的配置和模块
d. 绑定监听地址
监听功能默认监听所有地址
服务器有多个IP地址时,只监听提供服务的IP地址
#查看是否绑定IP地址
cat /etc/httpd/conf/httpd.conf | grep Listen
#修改监听地址
Listen x.x.x.x:80
e. 删除缺省安装文件
#删除缺省 HTML 文件:
rm -rf /usr/local/apache2/htdocs/*
#删除缺省的 CGI 脚本:
rm –rf /usr/local/apache2/cgi-bin/*
#删除 Apache 说明文件:
rm –rf /usr/local/apache2/manual
#删除源代码文件:
rm -rf /path/to/httpd-2.2.4*
#删除 CGI。
#可根据实际情况删除,一般情况下 /var/www/html /var/www/cgi-bin 默认就是空的
f. 禁用非法HTTP方法
- 只允许GET、POST方法
<Location>
<LimitExcept GET POST CONNECT OPTIONS>
Order Allow,Deny
Deny from all
</LimitExcept>
</Location>
2. Tomcat服务
(1). 管理后台
a. 不使用
1. 使用安全组防护墙功能对管理后台URL进行拦截
2. 删除Tomcat的webapps/manager、webapps/host-manager文件夹
3. 注释Tomcat的conf/tomcat-users.xml所有代码
b. 使用
- 配置强口令
(2). 开启访问日志
- 修改conf/server.xml文件,取消以下代码注释
<Value className="org.apache.catalina.valves.AccessLogValue" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false" />
- 重启Tomcat服务
systemctl restart tomcat
(3). 默认账号安全
- 修改conf/tomcat-user.xml文件,重新设置复杂口令并保存文件
- 重启Tomcat服务
(4). 修改默认访问端口
- 修改conf/tomcat-user.xml文件,修改8080端口并保存文件
- 重启Tomcat服务
(5). 重定向错误
在webapps\manager目录中创建响应的错误页面文件
在conf/web.xml中添加如下代码
<error-page> <error-code>403</error-code> <location>/403.html</location> </error-page> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.html</location> </error-page>
重启Tomcat服务
(6). 禁止列出目录
修改web.xml文件内容
<param-name>listings</param-name> <!--改为以下内容--> <param-name>false</param-name>
(7). 删除文档和示例程序
- 删除webapps/docs、webapps/examples、webapps/manager、webapps/ROOT、webapps/host-manager文件夹
3. IIS环境
- 管理工具 => IIS服务器 => 网站 => dvbbs => 右键 => 属性
(1). 修改默认日志路径
可以设置为system读写,Administrator只读权限
c:\windows\system32\logfile => 其他路径
(2). 加固方法
- 修改日志属性
- 删除所有不必要的扩展名
- 不要向客户端发送详细信息
- 主目录= > 配置 => 选项(调试)
- IIS权限
- 不给写入和目录浏览
- 限制后台登录的IP地址
- 删除所有的自定义错误
- c:\windows\help\iishelp
4. PHP环境
配置文件/etc/php.ini
(1). 启用安全模式
- 修改 or 添加配置文件php.ini内容
safe_mode = on
a. 用户组安全
#关闭后,php脚本无法对文件进行访问,且相同用户组的用户也不能(Linux)
safe_mode_gid = off
b. 执行程序主目录
- 安全模式打开,却要执行某些程序,可指定要执行程序的主目录
#1.指定程序主目录
safe_mode_exec_dir = /usr/bin
#2.将程序拷贝到临时目录
safe_mode_exec_dir = /temp/cmd
#3.将执行目录指向网页目录(推荐)
safe_mode_exec_dir = /usr/www
c. 包含文件
safe_mode_include_dir = /usr/www/include/
d. 控制脚本访问目录
- 使用open_basedir选项能够控制PHP脚本只能访问指定的目录,一定程度上限制了phpshell
open_basedir = /usr/www
(2). 关闭危险函数
a. 禁用危险函数
disable_functions = system,passthru,exec,shll_exec,popen,phpinfo,escapeshellarg,escapeshellcnd,proc_close,proc_open,dll
b. 禁用文件操作
disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
(3). 关闭PHP版本信息
expose_php = Off
(4). 关闭注册全局变量
- POST、GET提交的变量会自动注册为全局变量,能直接访问
auto_globals_jit = On
register_globals = off
(5). SQL注入防护
- 打开magic_quotes_gpc来防止SQL注入 ,默认关闭,5.4.0以后已被移除
magic_quotes_gpc = On
(6). 错误控制信息
display_errors = Off
(7). 错误日志
log_errors = On
error_log = /usr/local/apache2/logs/php_error.log
四、数据库
1. Mysql
- 配置文件
/etc/my.cnf
(1). 账号安全
a. 禁止管理员权限
[mysql.server]
user=mysql
b. 避免共享账号
insert into mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) values("localhost","test",password("test"),"","","");
c. 删除无关账号
DROP USER test;
(2). 口令
- 检查弱口令;密码修改时间
update user set password=password('123456') where user='test';
flush privileges;
(3). 授权
a. 查看授权情况
use mysql;
select * from user;
seletc * from db;
seletc * from host;
seletc * from tbales_priv;
seletc * from columns_priv;
b. 查看某用户权限
#创建用户,不指定登录主机
create user 'test'@'%' identified by '123456';
#授予所有权限
grant all privileges on *.* to 'test'@'%' with grant option;
#授予指定数据库权限
grant all privileges on database_name.* to 'test'@'%';
#查看权限
show grants for test@'%'
c. revoke回收权限
①语法
help revoke
Name: 'REVOKE'
Description:
Syntax:
REVOKE
priv_type [(column_list)]
[,priv_type[(column_list)]] ...
ON [object_type]
{
*
| *.*
| db_name.*
| db_name.tal_name
| tbl_name
| db_name.routine_name
}
FROM user [,user]...
②实例
revoke insert,update,delete,create,drop on *.* from test@'%'
(4). 日志审计
a. 可选内容
#正常日志目录
log = /var/log/mariadb/mariadb/
#错误日志
log-error=C:/mysql_logs/mysql_error.log
log_errors = On
error_log = /var/log/php/php_error.log
#查询日志(可选)
general-log=1
general-log-file=c:/mysql_logs/mysql_query.log
#慢查询日志(可选)
slow-query-log=1
slow-query-log-file=C:/mysql_logs/mysql_slow queries.log
#更新日志2
log-update=c:/mysql_logs/mysql_update.log
#二进制日志
log-bin=C:/mysql_logs/mysql bin log
b. 开启日志功能
#编辑配置文件my.ini
vim etc/php.d/my.ini
log_errors = On
error_log = /var/log/php/php_error.log
c. 日志操作
#命令可査看所有的 log
show variables like 'log_%';
#命令可査看具体的 log
show variables like 'log_bin';
(5). 安装最新补丁
(6). 禁止远程访问
- 在MYSQL服务器的启动参数中添加
--skip-networking
禁止远程TCP/IP连接
(7). 设置可信IP访问
GRANT ALL PRIVILEGES ON db.* TO 用户名@'IP子网/掩码';
(8). 连接数设置
- 在配置文件my.cnf或my.ini中配置
[mysqld]
max_connections=1000
2. PhpMyadmin
(1). 网络访问控制
- 限制访问人员配置PhpMyadmin
#进入PhpMyadmin目录,找到config.ini.php
#添加如下代码
$ip_prefix='192.168.0.1'
if(substr($_SERVER['REMOTE_ADDR'],0,strlen($ip_prefix))!=$ip_prefix) die('Access denied');
(2). 账号与口令
- 设置复杂的口令
3. MongoDB
- MongoDB服务默认没有权限验证
- 配置文件
/etc/mongod.conf
- 连接指令
mongo --host [ip] --port [port]
(1). 排查方向
查看MongoDB的日志是否完整,并确认执行删除数据库的源IP地址和时间、行为。
检查MongoDB帐户,查看是否没有添加admin用户的密码
db.system.users.find()
- 检查GridFs,查看是否存储任何文件
db.fs.files.find()
- 检查日志文件,查看有哪些用户访问了MongoDB
show log global
(2). 修改默认端口
vim /etc/mongo.conf
(3). 隔绝外网
- 使用安全组防火墙 or 本地操作系统防火墙进行控制
(4). –bind_ip选项
- 启动mongodb使用
--bind_ip 192.168.0.1
表示启动ip绑定,数据库实例只监听192.168.0.1的请求
(5). 角色登录认证
创建用户
test
,密码test1234
在未开启认证的环境下,登录数据库
mongo 127.0.0.1:27028 mongo --host [ip] --port [port]
切换到admin数据库
use admin
- 创建管理员帐号
#1. 创建账号
db.addUser("test","test1234")
or
db.createUser({user:"test",pwd:"test1234",roles:["root"]})
#2.查看连接
db.getCollectionNames()
- 验证是否创建成功
db.getUsers()
or
db.system.users.find().toArray()
#验证是否具有该用户
db.auth("test","test1234")
- 结束进程,重启MongoDB服务
service mongod restart
- 开启认证模式
mongod -f /etc/mongod.conf --auth
(6). 禁用HTTP和REST端口
#1. 修改配置文件
nohttpinterface = false
#2. 启动MongoDB时使用参数
--nohttpinterface
(7). 开启日志
(8). 使用SSL加密
- 防范
man-in-the-middle
攻击
(9). 备份与恢复
a. 本地备份
mongodump -h dbhost -d dbname -o dbdirectory
#-h mongdb所在服务器
#-d 需要备份的数据库实例
#-o 备份数据存放位置(前提是目录存在)
b. 数据恢复
mongorestore -h dbhost -d dbname --directoryper dbdirectory
c. Mongo dump
4. Memcached
(1). 定期升级
(2). 配置访问控制
iptables -A INPUT -p tcp -s 192.1686.0.2 --dport 11211 -j ACCEPT
(3).绑定监听
memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
(4). 权限最小化
(5). 启用认证功能
- 从1.4.3版本开始,支持SASL认证
(6). 修改默认端口
- 默认端口
11222
memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11222 -c 1024 -P /tmp/memcached.pid
(7). 备份数据
5. Redis
- 未授权访问导致的
弱口令
、写入SSH公钥
(1). 网络层加固
- 配置文件
redis.conf
中指定Redis服务使用的网卡,默认监听127.0.0.1
#去掉下列语句的注释符号
bind 127.0.0.1
bind 192.168.1.100 10.0.0.1
(2). 设置防火墙
iptables -A INPUT -s x.x.x.x -p tcp --dport 6379 -j ACCEPT
(3). 账号与认证
- 设置密码,打开配置文件redis.conf
#找到以下字段,去掉注释,补充密码
requirepass test1234
(4). 权限最小化
- 以较低权限账号运行Redis服务,并禁用该账号登录权限
useradd -M-s /sbin/nologin [username]
(5). 服务精细化授权
- redis无权限分离,管理员帐号和普通账号无明显区别,因此隐藏以下重要指令
FLUSHDB,FLUSHALL,KEYS,PEXPIRE,DEL,CONFIG,SHUTDOWN,BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME,DEBUG, EVAL
```mysql
#进入redis后
rename-command CONFIG ""
rename-command flushdb ""
rename-command flushall "" #隐藏指令
rename-command shutdown shotdown-test #重命名指令
(6). 安全补丁
6. Oracle
(1). 检查远程登录
#将参数REMOTE LOGIN PASSWORDFILE设置为NONE;
show parameter REMOTE_LOGIN_PASSWORDFILE
#修改配置
alter system set remote_login_passwordfile=none scope=spfile;
shutdown immediate
startup
(2). 用户属性控制
#查询视图dba profiles和dba users来检查profile是否创建,存在default以外的profile即可
Select profile from dba_profiles;
Select profile from dba_users;
#设置
create profile maintenance limit PASSWORD_VERIFY_FUNCTION_F_PASSWORD_VERIFY
PASSWORD_REUSE_MAX 5
PASSWORD_GRACE TIME 60
FAILED_LOGIN_ATTEMPTS 6
PASSWORD_LIFE_TIME 90;
(3). 数据字典访问权限
#检查参数是否设置为False
show parameter 07_DICTIONARY_ACCESSIBILITY
#设置
alter system Set 07 DICTIONARY ACCESSIBILITY=FALSE scope=spfile;
shutdown immediate
startup
(4). 口令与认证
a. 账户口令的生存期
- 减少时间
#检查参数值
select dba_profiles,profile,resource_name, limit
from dba_profiles, dba_users
where dba_profiles.profile = dba_users.profile
and dba users.account status=OPE/?
and resource_name='PASSWORD_GRACE_TIME';
#设置
alter profile default limit PASSWORD_GRACE_TIME 60;
b. 重复口令使用
#检查
select dba_profiles.profile,resource_name, limit
from dba_profiles,dba users
where dba_profiles.profile = dba_users.profile
and dba_users.account status=OPEN'
and resource_name= 'PASSWORD_REUSE_MAX;
#设置
alter profile default limit PASSWORD_REUSE_MAX 5;
c. 认证控制
#检查FAILED LOGIN ATTEMPTS是否等于6
select dba_profiles.profile,resource_name, limit
from dba_profiles,dba_users
where dba_profiles.profile = dba_users.profile
and dba_users.account status= 'OPEN'
and resource_name= 'FAILED_LOGIN_ATTEMPTS';
#设置
alter profile defauIt limit FAILED_LOGIN_ATTEMPTS 6;
d. 更改默认账户密码
#检查
sqlplus '/as sysdba'
conn system/system
conn system/manager
conn sys/sys
conn sys/cHAnge_on_install
conn scott/scott
conn scott/tiger
conn dbsnmp/dbsnmp
conn rman/rman
conn xdb/xdb
#以上均不能成功登录
e. 密码更改策略
#检查PASSWORD_LIFE_TIME是否小于等于90
select profile,limit from dba_profiles
where resource_name='PASSWORD LIFE TME'
and profile in (select profile from dba_users where account_status= 'OPEN');
#设置
alter profile default limit PASSWORD_LIFE_TIME 90;
f. 密码复杂度策略
(4). 数据库审计策略
#检查
1.使用参数设置,
show parameter audit_trail
#参数audit_trail不为NONE。
#检査dba_audit_trail视图中或$ORACLE_BASE/admin/adump目录下是否有数据。
2.查看审计表,检查是否有用户登录、操作记录
select * froM LOGON_AUDIT.LOGON_AUDIT;
#设置
alter system set audit trail=os scope=spfile;
shutdown immediate
startup
(5). 设置监听密码
#检查
检查$ORACLE_HOME/network/admin/listener.ora文件中是否设置参数PASSWORDS LISTENER.
#设置
$ ps -eflgrep tns
$ lsnrctl
set current_listener listener
change_password
save_config
set password
exit
(6). 使用角色管理
#检查应用用户是否授予dba角色
select * from dba role privs where granted role='DBA';
#设置
create role
grant 角色 to username;
revoke DBA from username;
(7). 连接超时设置
#检查sqlnet.ora文件,查看文件中设置参数SQLNET.EXPIRE_TIME=15
cat $ORACLE HOME/network/admin/sglnet.ora
#设置
$ vi sqlnet.ora
SOLNET.EXPIRE_TIME=10
(8). 安全补丁
#检查
1.oracle补丁是否为最新
#设置
2.升级为最新补丁,需要Oracle Metalink 帐号下载安全补丁
(9). 可信IP地址访问
#检查sqlnet.ora中是否设置
tcp.validnode_checking = yes,
tcp.invited_nodes :
$ cat $ORACLE_HOME/network/admin/sqlnet.ora
#设置
vim sqlnet.ora
tcp.validnode_checking = yes
tcp.invited_nodes =(ip1,ip2...)
(10). 资源控制
#检查空闲超时设置
select profile,limit from dba_profiles where profile='DEFAULT' and resource_name='DLE_TIME';
#设置
IDLE_TIME返回结果应大于0