操作系统和数据库系统管理用户身份鉴别信息应具有不易被冒用的特点,口令应有复杂度要求并定期更换。
设置有效的密码策略,防止攻击者破解出密码
1)查看空口令帐号并为弱/空口令帐号设置强密码
1 |
# awk -F: '($2 == ""){print $1}' /etc/shadow |
可用离线破解、暴力字典破解或者密码网站查询出帐号密钥的密码是否是弱口令
2)修改vi /etc/login.defs配置密码周期策略
此策略只对策略实施后所创建的帐号生效, 以前的帐号还是按99999天周期时间来算。
3)/etc/pam.d/system-auth配置密码复杂度:
在文件中添加如下一行:
1 |
password requisite pam_cracklib.so retry=3 difok=2 minlen=8 lcredit=-1 dcredit=-1 |
参数含义如下所示:
difok:本次密码与上次密码至少不同字符数
minlen:密码最小长度,此配置优先于login.defs中的PASS_MAX_DAYS
ucredit:最少大写字母
lcredit:最少小写字母
dcredit:最少数字
retry:重试多少次后返回密码修改错误
【注】用root修改其他帐号都不受密码周期及复杂度配置的影响。
应启用登录失败处理功能,可采取结束会话、限制非法登录次数和自动退出等措施。
遭遇密码破解时,暂时锁定帐号,降低密码被猜解的可能性
1)方法一:/etc/pam.d/login中设定控制台;/etc/pam.d/sshd中设定SSH
/etc/pam.d/sshd中第二行添加下列信息
1 |
auth required pam_tally2.so deny=5 lock_time=2 even_deny_root unlock_time=60 |
###########参数解释############
查看用户登录失败次数
# pam_tally2 --user root
解锁用户
# pam_tally2 -r -u root
even_deny_root 也限制root用户(默认配置就锁定root帐号);
deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户
unlock_time 设定普通用户锁定后,多少时间后解锁,单位是秒;
root_unlock_time 设定root用户锁定后,多少时间后解锁,单位是秒;
当对服务器进行远程管理时,应采取必要措施,防止鉴别信息在网络传输过程中被窃听。
防止远程管理过程中,密码等敏感信息被窃听
执行如下语句,查看telnet服务是否在运行
禁止telnet运行,禁止开机启动,如下图:
应及时删除多余的、过期的帐户,避免共享帐户的存在。
删除或禁用临时、过期及可疑的帐号,防止被非法利用。
主要是管理员创建的普通帐号,如:test
# usermod -L user 禁用帐号,帐号无法登录,/etc/shadow第二栏显示为!开头
# userdel user 删除user用户
# userdel -r user将删除user用户,并且将/home目录下的user目录一并删除
加固后如图
审计范围应覆盖到服务器和重要客户端上的每个操作系统用户和数据库用户;
开启审核策略,若日后系统出现故障、安全事故则可以查看系统日志文件,排除故障、追查入侵者的信息等。
查看rsyslog与auditd服务是否开启
rsyslog一般都会开启,auditd如没开启,执行如下命令:
1 |
# systemctl start auditd |
auditd服务开机启动
1 |
# systemctl start auditd |
应保护审计记录,避免受到未预期的删除、修改或覆盖等。
防止重要日志信息被覆盖
让日志文件转储一个月,保留6个月的信息,先查看目前配置,
1 |
# more /etc/logrotate.conf | grep -v "^#\|^$" |
需要修改配置为下图所示:
操作系统遵循最小安装的原则,仅安装需要的组件和应用程序,并通过设置升级服务器等方式保持系统补丁及时得到更新。
关闭与系统业务无关或不必要的服务,减小系统被黑客被攻击、渗透的风险。
禁用蓝牙服务
1 |
# systemctl stop bluetooth |
禁止蓝牙开机启动
应通过设定终端接入方式、网络地址范围等条件限制终端登录。
对接入服务器的IP、方式等进行限制,可以阻止非法入侵。
1) 在/etc/hosts.allow和/etc/hosts.deny文件中配置接入限制
最好的策略就是阻止所有的主机在“/etc/hosts.deny”文件中加入“ ALL:ALL@ALL, PARANOID ”,然后再在“/etc/hosts.allow” 文件中加入所有允许访问的主机列表。如下操作:
编辑 hosts.deny文件(vi /etc/hosts.deny),加入下面该行:
1 2 |
# Deny access to everyone. ALL: ALL@ALL, PARANOID |
编辑hosts.allow 文件(vi /etc/hosts.allow),加入允许访问的主机列表,比如:
ftp: 202.54.15.99 foo.com //202.54.15.99是允许访问 ftp 服务的 IP 地址
//foo.com 是允许访问 ftp 服务的主机名称。
2) 也可以用iptables进行访问控制
应根据安全策略设置登录终端的操作超时锁定。
设置登录超时时间,释放系统资源,也提高服务器的安全性。
/etc/profile中添加如下一行
1 2 |
exprot TMOUT=900 //15分钟 # source /etc/profile |
# source /etc/profile
改变这项设置后,必须先注销用户,再用该用户登录才能激活这个功能。
如果有需要,开启屏幕保护功能
设置屏幕保护:设置 -> 系统设置 -> 屏幕保护程序,进行操作
对Linux系统的安全性提升有一定帮助。
防止拒绝服务攻击
TCP SYN保护机制等设置
1)打开 syncookie:
# echo“1”>/proc/sys/net/ipv4/tcp_syncookies //默认为1,一般不用设置
表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
2)防syn 攻击优化
用vi编辑/etc/sysctl.conf,添加如下行:
1 |
net.ipv4.tcp_max_syn_backlog = 2048 |
进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.可调整到2048.
为历史的命令增加登录的IP地址、执行命令时间等
1)保存1万条命令
1 |
# sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile |
2)在/etc/profile的文件尾部添加如下行数配置信息:
1 2 3 4 5 6 7 8 |
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}' |sed -e 's/[()]//g'` if [ "$USER_IP" = "" ] then USER_IP=`hostname` fi export HISTTIMEFORMAT="%F %T $USER_IP `whoami` " shopt -s histappend export PROMPT_COMMAND="history -a" |
##source /etc/profile让配置生效
1、备份nginx.conf 配置文件。
修改配置,按如下设置日志记录文件、记录内容、记录格式,添加标签为main的log_format格式
(http标签内,在所有的server标签内可以调用):log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
2、在server标签内,定义日志路径
access_log logs/host.access.log main
3、保存,然后后重启nginx服务。
备份nginx.conf配置文件。
编辑配置文件,HTTP模块添加如下一行内容:
autoindex off;
保存,然后后重启nginx服务。
备份nginx.conf配置文件。
编辑配置文件,在server标签内添加如下内容:
#示例:去掉单个目录的PHP执行权限location ~ /attachments/.*\.(php|php5)?$ {deny all;} #示例:去掉多个目录的PHP执行权限location ~/(attachments|upload)/.*\.(php|php5)?$ {deny all;}
保存,然后后重启nginx服务。
需要注意两点:
1、以上的配置文件代码需要放到 location ~ .php{...}上面,如果放到下面是无效的;
2、attachments需要写相对路径,不能写绝对路径。
备份nginx.conf配置文件。
修改配置,在http{}段加入如下内容
http {...fastcgi_intercept_errors on;error_page 401 /401.html;error_page 402 /402.html;error_page 403 /403.html;error_page 404 /404.html;error_page 405 /405.html;error_page 500 /500.html;...}修改内容:ErrorDocument 400 /custom400.htmlErrorDocument 401 /custom401.htmlErrorDocument 403 /custom403.htmlErrorDocument 404 /custom404.htmlErrorDocument 405 /custom405.htmlErrorDocument 500 /custom500.html其中401.html、402.html、403.html、404.html、405.html、500.html 为要指定的错误提示页面
保存,重启 nginx 服务生效
4.5.1 隐藏版本信息
备份nginx.conf配置文件。
编辑配置文件,添加http模块中如下一行内容:
server_tokens off;
保存,然后后重启nginx服务。
4.5.2 限制HTTP请求方法
备份nginx.conf配置文件。
编辑配置文件,添加如下内容:
if ($request_method !~ ^(GET|HEAD|POST)$ ) {return 444;}
保存,然后后重启nginx服务。
备注:只允许常用的GET和POST方法,顶多再加一个HEAD方法
4.5.3 限制IP访问
备份nginx.conf配置文件。
编辑配置文件,在server标签内添加如下内容:
location / {deny 192.168.1.1; #拒绝IPallow 192.168.1.0/24; #允许IPallow 10.1.1.0/16; #允许IPdeny all; #拒绝其他所有IP}
保存,然后后重启nginx服务。
4.5.4 限制并发和速度
备份nginx.conf配置文件。
编辑配置文件,在server标签内添加如下内容:
limit_zone one $binary_remote_addr 10m;server{ listen 80; server_name down.test.com; index index.html index.htm index.php; root /usr/local/www; #Zone limit; location / { limit_conn one 1; limit_rate 20k; }………}
保存,然后重启nginx服务。
4.5.5 控制超时时间
备份nginx.conf配置文件。
编辑配置文件,具体设置如下:
client_body_timeout 10; #设置客户端请求主体读取超时时间client_header_timeout 10; #设置客户端请求头读取超时时间keepalive_timeout 5 5; #第一个参数指定客户端连接保持活动的超时时间,第二个参数是可选的,它指定了消息头保持活动的有效时间send_timeout10; #指定响应客户端的超时时间
保存,然后后重启nginx服务。
4.6.1 Nginx降权
备份nginx.conf配置文件。
编辑配置文件,添加如下一行内容:
user nobody;
保存,然后后重启nginx服务。
4.6.2 防盗链
备份nginx.conf配置文件。
编辑配置文件,在server标签内添加如下内容:
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked server_names *.nsfocus.com http://localhost baidu.com; if ($invalid_referer) { rewrite ^/ [img]http://www.XXX.com/images/default/logo.gif[/img]; # return 403; }}
保存,然后后重启nginx服务。
Apache安全加固
1 禁止目录浏览
(1) 备份httpd.conf配置文件,修改内容:
Options FollowSymLinks AllowOverride None Order allow,deny Allow from all 将Options Indexes FollowSymLinks 中的Indexes 去掉,就可以禁止 Apache显示该目录结构。
(2)设置 Apache 的默认页面:
DirectoryIndex index.html 其中index.html即为默认页面,可根据情况改为其它文件,部分服务器需要在目录下新建空白的index.htm才能生效。
(3)重新启动 Apache 服务
4.2 日志配置
(1) 备份httpd.conf配置文件,修改内容:
Window下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%i\" \"%i\"" combined CustomLog "|bin/rotatelogs.exe logs/localhost_access_log.%Y-%m-%d.log 86400 480" combined
增加红色字体这一行,即可开启apache日志并且按照日期划分创建。
(2) 重新启动 Apache 服务
4.3 限制目录执行权限
(1) 备份httpd.conf配置文件,修改内容:
Order Allow,Deny
Deny from all
(1)备份httpd.conf配置文件,修改内容:
ErrorDocument 400 /custom400.html ErrorDocument 401 /custom401.html ErrorDocument 403 /custom403.html ErrorDocument 404 /custom404.html ErrorDocument 405 /custom405.html ErrorDocument 500 /custom500.html 其中Customxxx.html 为要设置的错误页面。
(2)重新启动 Apache 服务生效
4.5 最佳操作实践
4.5.1隐藏Apache版本号
(1) 备份httpd.conf 文件,修改内容:
ServerSignature Off ServerTokens Prod
(2) 重新启动 Apache 服务
(1) 备份httpd.conf配置文件,修改内容: Options FollowSymLinks AllowOverride None Order Deny,Allow Deny from all Allow from 192.168.204.0/24
只允许从192.168.204.0/24 IP段内的用户访问,一般在限制后台访问时用到。
备份httpd.conf文件 修改: User nobody Group# -1 重启 APACHE /apachectl restart Windows中操作步骤为: 新建系统用户组www,新建系统用户apache并设置密码。 运行services.msc打开服务管理界面,双击apache2.2服务打开属性页,点击“登录”选项卡,选择“此账户”,填写账号和密码,确定。
备份httpd.conf配置文件,修改内容: Timeout 10 KeepAlive On KeepAliveTimeout 15 AcceptFilter http data AcceptFilter https data 重新启动 Apache 服务生效
备份httpd.conf配置文件,修改内容: LimitRequestBody 102400
重启apache生效
上传文件的大小也会受到此参数限制。
SSH 安全加固
编辑配置文件
vim /etc/ssh/sshd_config 修改 PermitRootLogin 后面的 yes 为 no , 并且去掉前面的注释符。
编辑账户登录文件
vim /etc/pam.d/login
配置auth required pam_securetty.so 编辑账户信息文件
vim /etc/passwd 使账户信息的shell为/sbin/nologin的为禁止远程登陆,如要允许,则改成可以登陆的shell即可,如/sbin/bash。 然后重启sshd服务 service sshd restart
0x02 设置用户密码复杂度和过期时间
修改/etc/login.defs文件
PASS_MAX_DAYS 90 #密码最长过期天数PASS_MIN_DAYS 80 #密码最小过期天数PASS_MIN_LEN 10 #密码最小长度PASS_WARN_AGE 7 #密码过期警告天数
0x03 登陆超时设置
vim /etc/profile// 在最后一行加入 TMOUT=300
0x04 系统关键文件权限设置
通过chmod命令对目录的权限进行实际设置
/etc/passwd -- 必须所有用户都可读,Root用户可写 –rw-r--r-- /etc/shadow -- 只有Root可读 –r-------- /etc/group -- 须所有用户都可读,Root用户可写 –rw-r--r--
使用如下命令设置:
chmod 644 /etc/passwdchmod 600 /etc/shadowchmod 644 /etc/group
0x05 设置文件与目录缺省权限
在文件 /etc/profile 中设置 umask 027 或 UMASK 027
设置默认权限:
vim /etc/login.defs 在末尾增加 umask 027 或 UMASK 027,将缺省访问权限设置为750。
0x06 设置ssh登录前警告Banner
1) 执行如下命令创建ssh banner信息文件:(使用Root权限执行) touch /etc/ssh_banner #chown bin:bin /etc/ssh_banner #chmod 644 /etc/ssh_banner echo " Authorized only. All activity will be monitored and reported "> /etc/ssh_banner 可根据实际需要修改该文件的内容。 2) 修改 /etc/ssh/sshd_config 文件,添加如下行: Banner /etc/ssh_banner 3) 重启sshd服务: /etc/init.d/sshd restartservice sshd restart
0x07 修改ssh默认端口
vi /etc/ssh/sshd_config// 修改Port 17382// 重启sshd服务service sshd restart
0x08 限制用户su到Root
编辑su文件
vim /etc/pam.d/su// 在开头添加下面两行:auth sufficient pam_rootok.soauth required pam_wheel.so group=wheel// 这表明只有wheel组的成员可以使用su命令成为Root用户。 你可以把用户添加到wheel组,以使它可以使用su命令成为Root用户。 添加方法为:usermod –G wheel username 备注:双方共同运维服务器,且Root密码为我方知晓时设置。
0x09 检查拥有suid和sgid权限的文件
执行命令:
find /usr/bin/chage /usr/bin/gpasswd /usr/bin/wall /usr/bin/chfn /usr/bin/chsh /usr/bin/newgrp /usr/bin/write /usr/sbin/usernetctl /usr/sbin/traceroute /bin/mount /bin/umount /bin/ping /sbin/netreport -type f -perm -04000 -o -perm -02000 -type f -xdev 2 > /dev/null
如果存在输出结果,则使用 chmod 755 文件名 命令修改文件的权限。
例如:chmod a-s /usr/bin/chage
禁止使用旧密码
找到同时有 “password” 和 “pam_unix.so” 字段并且附加有 “remember=5” 的那行,它表示禁止使用最近用过的5个密码(己使用过的密码会被保存在 /etc/security/opasswd 下面)。
Debian、Ubuntu 或 Linux Mint 系统上: $ sudo vi /etc/pam.d/common-password password [success=1 default=ignore] pam_unix.so obscure sha512 remember=5
CentOS、Fedora、RHEL 系统上: $ sudo vi /etc/pam.d/system-auth password sufficient pamunix.so sha512 shadow nullok tryfirstpass useauthtok remember=5
三、设置最短密码长度
找到同时有 “password” 和 “pam_cracklib.so” 字段并且附加有 “minlen=10” 的那行,它表示最小密码长度为(10 - 类型数量)。这里的 “类型数量” 表示不同的字符类型数量。PAM 提供4种类型符号作为密码(大写字母、小写字母、数字和标点符号)。如果你的密码同时用上了这4种类型的符号,并且你的 minlen 设为10,那么最短的密码长度允许是6个字符。
Debian、Ubuntu 或 Linux Mint 系统上: $ sudo vi /etc/pam.d/common-password password requisite pam_cracklib.so retry=3 minlen=10 difok=3
1
CentOS、Fedora、RHEL 系统上: $ sudo vi /etc/pam.d/system-auth password requisite pam_cracklib.so retry=3 difok=3 minlen=10
1
四、设置密码复杂度
找到同时有 “password” 和 “pam_cracklib.so” 字段并且附加有 “ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1” 的那行,它表示密码必须至少包含一个大写字母(ucredit),两个小写字母(lcredit),一个数字(dcredit)和一个标点符号(ocredit)。
Debian、Ubuntu 或 Linux Mint 系统上:
$ sudo vi /etc/pam.d/common-password password requisite pam_cracklib.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1
CentOS、Fedora、RHEL 系统上:
$ sudo vi /etc/pam.d/system-auth password requisite pam_cracklib.so retry=3 difok=3 minlen=10 ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1
五、设置密码过期期限
编辑 /etc/login.defs 文件,可以设置当前密码的有效期限,具体变量如下所示:
$ sudo vi /etc/login.defs PASSMAXDAYS 150 PASSMINDAYS 0 PASSWARNAGE 7
这些设置要求用户每6个月改变他们的密码,并且会提前7天提醒用户密码快到期了。
如果你想为每个用户设置不同的密码期限,使用 chage 命令。下面的命令可以查看某个用户的密码限期:
$ sudo chage -l xmodulo Last password change : Dec 30, 2013 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
默认情况下,用户的密码永不过期。
下面的命令用于修改 xmodulo 用户的密码期限:
$ sudo chage -E 9/30/2019-m 5 -M 90 -I 30 -W 14 xmodulo
Linux 防火墙加固
Linux系统禁用23端口;
iptables -A INPUT -p tcp --dport 23 -j DROP
17.Linux系统禁止别人ping通;
A.临时方法:
echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all
B.永久PING配置方法。
/etc/sysctl.conf中增加一行
net.ipv4.icmp_echo_ignore_all=1
C.不该默认配置情况下,使用防火墙禁止
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
18.为确保安全Linux系统禁止所有人通过ssh连接除了172.16.1.1这个ip。
iptables -A INPUT -s 172.16.1.1 -p tcp --dport 22 -j ACCEPT