1.安装Linux系统后调优及安全设置
1. 1 关闭SELinux功能
SELinux功能(类似防火墙)大多数生产环境的做法是关闭,安全问题通过其它手段来解决。
查看selinux的配置文件:cat /etc/selinux/config
# SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
SELINUX有三种状态:
- enforcing(强制执行)
- permissive(许可的)
- disabled(关闭)。
目前默认系统是enforcing(强制执行)状态,我们需要将其改为disabled。
关闭方式:
1. 修改配置文件,使关闭SELinux永久生效
[root@oldboy ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
修改配置文件可使配置永久生效,但必须要重启系统。
上面是通过sed的替换命令快速修改,也可通过vi或vim编辑器修改。
2.临时关闭SELinux,可在命令行执行如下命令:
由于修改配置SElinux后,想要其生效,必须要重启系统。
因此,可配合使用setenforce 0这个临时使其关闭的命令,这样在重启前后都可以使SELinux关闭生效,也就是说无须立刻重启服务器了,在生产场景下Linux机器是不能随意重启的。
[root@oldboy ~]# getenforce Enforcing [root@oldboy ~]# setenforce usage: setenforce [ Enforcing | Permissive | 1 | 0 ] [root@oldboy ~]# setenforce 0 # 临时将SELinux调成Permissive状态 [root@oldboy ~]# getenforce Permissive
- getenforce 查看SELinux的当前的级别状态
- setenforce 用于命令行管理SELinux的级别,后面的数字表示设置对应的级别
- 参数1对应Enforcing,表示SELinux为开启状态
- 参数0对应Permissive,给出警告提示,但不会阻止操作,相当于disable
1.2 设定运行级别
设定运行级别(runlevel)为3,即:表示使用文本命令行模式管理Linux。
cat /etc/inittab # 查看运行级别
[root@oldboy ~]# cat /etc/inittab # inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/rc.conf # # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf, # with configuration in /etc/sysconfig/init. # # For information on how to write upstart event handlers, or how # upstart works, see init(5), init(8), and initctl(8). # # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault:
这里3就是Linux默认的运行级别,如果有需求可以将其修改为其它级别。工作中常用3级别,即文本模式。
- runlevel 查看当前系统运行级别
- init 切换运行级别
- init 0 关机
- init 6 重启
- init 3 正常文本命令行模式,多用户
- init 1 系统出现问题时的单用户模式
- init 5 切换到桌面模式
1.3 精简开机系统自启动
企业环境新装Linux系统之后有必要保留的开机自启动服务有5个:
- sshd:远程连接Linux服务器时需要用到这个服务程序,所以必须要开启,否则Linux服务器就无法提供远程连接服务了。
- rsyslog:日志相关软件,这是操作系统提供的一种机制,系统的守护程序通常会使用rsyslog程序将各种信息写到各个系统日志文件中,在CentOS 6以前此服务的名称为syslog。
- network:系统启动时,若想激活/关闭各个网络接口,则必须考虑开启此服务。
- crond:该服务用于周期性地执行系统及用户配置的任务计划。有要周期性执行的任务时,就要开启,此服务几乎是声场场景必须要用的一个软件。
- sysstat:sysstat是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据很有帮助,比如CPU使用率、硬盘和网络吞吐数据等,对这些数据的收集和分析,有利于判断系统运行是否正常,所以它是提高系统运行效率、安全运行服务器的得力助手。
- iostat 工具提供CPU使用率以及硬盘吞吐效率的数据
- mpstat 工具提供与单个或多个处理器相关的数据
- sar 工具负责收集、报告并存储系统活跃的信息
上述5个服务是安装完系统后建议保留的开机自启动服务,也几乎是一切生产服务器必须保留的开机自启动服务。
将来还可以根据服务器的业务使用场景调整相应的自启动服务。
设置开机自启动的常见方法:
1. 执行命令,然后手动选择处理的方法
- 方法1:执行ntsysv命令,然后在弹出的窗口中进行设置。
- 方法2:执行setup命令,system service,然后在弹出的窗口中进行设置。
方法1:执行 ntsysv 命令,然后在弹出的窗口中进行设置。
把* 去掉,就是取消了。
方法2:执行setup命令,system service,然后在弹出的窗口中进行设置。
按tab键将光标移动到Quit。
2. 通过一行命令或Shell脚本进行设置
在快速设置前,先来查看默认情况下Linux系统开启的服务有哪些。
由于我们工作在文本模式3级别,因此只需要查找3级别上开启的服务即可。
查看命令如下:
chkconfig --list |grep 3:on
[root@oldboy ~]# chkconfig --list|grep 3:on abrt-ccpp 0:off 1:off 2:off 3:on 4:off 5:on 6:off abrtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off blk-availability 0:off 1:on 2:on 3:on 4:on 5:on 6:off chktestd 0:off 1:off 2:on 3:on 4:on 5:on 6:on cpuspeed 0:off 1:on 2:on 3:on 4:on 5:on 6:off crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off haldaemon 0:off 1:off 2:off 3:on 4:on 5:on 6:off ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off irqbalance 0:off 1:off 2:off 3:on 4:on 5:on 6:off kdump 0:off 1:off 2:off 3:on 4:on 5:on 6:off lvm2-monitor 0:off 1:on 2:on 3:on 4:on 5:on 6:off mdmonitor 0:off 1:off 2:on 3:on 4:on 5:on 6:off messagebus 0:off 1:off 2:on 3:on 4:on 5:on 6:off netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off udev-post 0:off 1:on 2:on 3:on 4:on 5:on 6:off
可以看到,默认情况下,开启了很多服务,我们需要保留开启的所有服务也包含其中。
这里只需要关注3级别上的设置是否为on即可(on为开启状态)。
了解了系统在3级别上开启的服务后,就可以通过命令快速实现配置了。
下面是几种通过命令或脚本设置开机自启动的方法。
第一种快速处理方法:先全关闭,再开启需要保留的。
操作思路:
先将3级别文本模式下默认开启的服务都关闭,然后开启需要开启的服务。
[root@oldboy ~]# chkconfig --list|grep 3:on|awk '{print "chkconfig",$1,"off"}'|bash [root@oldboy ~]# chkconfig --list|grep -E 'sshd|rsyslog|network|crond|sysstat'|awk '{print "chkconfig",$1,"on"}'|bash
第二种快速处理方法:Shell循环实现
操作思路:默认情况下开机需要保留的服务已经是开启状态了,因此,只需把3级别文本模式下的已开启但又不需要的服务都关掉就好了。
[root@oldboy ~]# for ser in `chkconfig --list|grep 3:on|grep -vE "sshd|sysstat|crond|network|rsyslog"|awk '{print $1}'`;do chkconfig $ser off;done
第三种快速处理方法:不要Shell循环语句也一条命令搞定
操作思路:
默认情况下开机需要保留的服务都已经是开启状态了,因此,只需把3级别文本模式下已经开启但又不需要开启的服务都关掉就好了,这里将不用循环结构而是利用命令拼出所有要处理的命令字符串,然后通过bash将其当做命令执行。
[root@oldboy ~]# chkconfig --list|grep '3:on'|egrep -v 'crond|sshd|network|rsyslog|sysstat' |awk '{print "chkconfig",$1,"off"}'|bash
将指定的要自启动的服务批量启动:
chkconfig --list|egrep 'crond|sshd|network|rsyslog|sysstat'|awk '{print "chkconfig",$1,"on"}'|bash
1.4 关闭iptables防火墙
关闭防火墙的目的是让初学者学习更方便,将来学了iptables技术后可再统一开启。
在企业环境中,一般只有配置外网IP的Linux服务器才需要开启防火墙,但即使有外网IP,高并发,高流量的业务服务器仍然不能开启防火墙,因为开启后会有较大性能损失,导致网站访问速度很慢,这种情况下只能在前端加更好的硬件防火墙了。
临时关闭防火墙:
/etc/init.d/iptables stop
[root@oldboy ~]# /etc/init.d/iptables stop iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] [root@oldboy ~]# /etc/init.d/iptables status iptables: Firewall is not running
永久关闭防火墙:
chkconfig iptables off 开关开机自启动命令
1.5 Linux系统安全最小原则
- 安装Linux系统最小化,即选包最小化,yum安装软件包也要最小化,无用的包不装。
- 开机自启动服务最小化,即无用的服务不开启
- 操作命令最小化。 如:能用rm -f test.txt 就不用rm -f test.txt
- 登录linux用户最小化。没有特殊需求就不登录root,就普通用户登录即可
- 普通用户授权权限最小化,即只给用户必须的管理系统的命令
- Linux系统文件及目录的权限设置最小化,禁止随意创建、更改、删除文件
1.6 更改SSH服务器端远程登录的设置
pdf 89
1.7 利用sudo控制用户对系统命令的使用权限
1.8 Linux中文显示问题
调整Linux系统的字符集设置。
查看linux字符集配置文件i18n:
[root@oldboy ~]# cat /etc/sysconfig/i18n LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16"
用sed替换掉LANG的字符集,将en_US.UTF-8改为zh_CN.UTF-8。
sed -i 's#en_US#zh_CN#g' /etc/sysconfig/i18n
用echo $LANG,发现虽然文件修改修改成功,还是LANG还是原来的,需要source启动生效。
source启动生效:
[root@oldboy ~]# . /etc/sysconfig/i18n [root@oldboy ~]# echo $LANG zh_CN.UTF-8
注意:
- zh_CN.UTF-8大小写字母
- 这个中文显示配置要与SSH客户端的配置一致
- 调整SSH客户端CRT的字符集,使其与Linux服务器端一致
1.9 设置Linux服务器时间同步
1.10 历史记录数和登录超时环境变量设置
设置闲置账号超时时间,临时生效:
export HISTSIZE=5
设定用户的命令行历史记录文件(~/.bash_history)记录指定命令数量的示例命令如下。
注意,此处的配置仅临时生效:
[root@oldboy ~]# export HISTFILESIZE=3 [root@oldboy ~]# cat ~/.bash_history # 命令行文件的对应记录数,一般10-20个为佳 ls cat /etc/sysconfig/i18n . /etc/sysconfig/il8n
将下面命令放入配置文件,可使其永久生效:
echo "export TIMEOUT=300" >>/etc/profile echo "export HISTSIZE=5" >>/etc/profile echo "export HISTFILESIZE=5" >>/etc/profile tail -3 /etc/profile source /etc/profile # 使得配置文件生效
在上述命令中,涉及的系统控制变量说明:
- TIMEOUT=300 连接的超时时间控制变量
- HISTSIZE=5 命令行的历史记录数量变量
- HISTFILESIZE=5 历史记录文件的命令数量变量(~/.bash_history)
实际工作中类似的变量还有不少,大家可以根据企业工作需求选择使用,最好执行前加上export命令。
更多的Linux系统的环境变量,大家可以执行man bash查询。
1.11 清除Linux登录时的系统信息介绍
清除Linux系统登录时的系统信息介绍:
[root@oldboy ~]# cat /etc/issue CentOS release 6.7 (Final) Kernel \r on an \m [root@oldboy ~]# >/etc/issue # 清除/etc/issue里面的系统信息说明 [root@oldboy ~]# cat /etc/issue
由于不同的版本的Linux的有漏洞,信息越明确,越容易被攻击。
1.11 调整Linux系统文件描述符数量
文件描述符是由【无符号整数】表示的句柄,进程使用它来标识打开的文件。
文件描述符与包括相关信息(如文件的打开模式、文件的位置类型、文件的初始类型等)的文件对象相关联,这些信息被称作文件的上下文。
文件描述符的有效范围是0到OPEN_MAX。
对于内核而言,所有打开的文件都是通过文件描述符引用的。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。
当读或写一个文件时,使用open或creat返回的文件描述符标识该文件,并将其作为参数传递给read或write,文件描述符定义的内容如下:
/* Standard file descriptors. */ #define STDIN_FILENO 0 /* Standard input. */ #defile STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */
查看Linux服务器文件描述符设置的情况可以使用 ulimit -n 命令,文件描述符大小默认是 1024。
[root@oldboy ~]# ulimit -n 1024
对于高并发的业务Linux服务器来说,这个默认的设置是不够的,需要调整。
调整方法1: 修改/etc/security/limits.conf 配置文件,在文件结尾加上:
* - nofile 65535
配置完成后,需要重新登陆才可以生效。
调整方法2: 直接将ulimit -SHn 65535 命令加入 /etc/rc.local,用以设置每次开机启动时配置生效。
cat >>/etc/rc.local<<EOF #-S use the 'soft' resource limit #-H use the 'hard' resource limit #-n the maximum number of open file descriptors ulimit -HSn 65535 #-s the maximum stack size ulimit -s 65535 EOF
1.12 Linux服务器内核参数优化
所谓Linux服务器内核参数优化,主要是指在Linux系统中针对业务服务应用而进行的系统内核参数调整,优化并无一定的标准。
配置文件:/etc/sysctl.conf
优化方法是添加如下内容到/etc/sysctl.conf文件:(如下优化适合apache,nginx,squid等多种web应用,特殊的业务可能需要略做调整)
[root@oldboy ~]# tail -22 /etc/sysctl.conf net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 net.core.somaxconn = 16384 net.core.netdev_max_backlog = 16384 net.ipv4.tcp_max_orphans = 16384 # iptables arguments 以下参数对iptables防火墙的优化,防火墙不开会提示,可以忽略不理 net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
通过sysctl -p检查参数。
[root@oldboy ~]# sysctl -p net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 net.core.somaxconn = 16384 net.core.netdev_max_backlog = 16384 net.ipv4.tcp_max_orphans = 16384 error: "net.nf_conntrack_max" is an unknown key error: "net.netfilter.nf_conntrack_max" is an unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_established" is an unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_time_wait" is an unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_close_wait" is an unknown key error: "net.netfilter.nf_conntrack_tcp_timeout_fin_wait" is an unknown key
在CentOS 6 环境中,必须开启iptable服务才不会出现上面所示的报错。
报错也可以暂时不理,这是针对防火墙的优化,而此时防火墙并没有开启,将来开启了就没有问题了。
Linux基础优化与安全重点小结:
- 不用root登陆管理系统,而以普通用户身份登陆, 通过sudo授权管理。
- 更改默认的远程连接SSH服务器端口,禁止root用户远程连接,甚至更改SSH服务,只监听内网IP
- 定时自动更新服务器的时间,使其与互联网时间同步
- 配置yum更新源,从国内更新源下载安装包
- 关闭SELinux及iptables(在工作场景中,如果有外部IP一般要打开iptables,高并发、高流量的服务器可能无法开启)
- 调整文件描述符的数量,进程及文件的打开都会消耗文件描述符数量
- 定时自动清理邮件临时目录垃圾文件,防止磁盘的inodes数被小文件占满(注意centos5和6要清除的目录不同)
- 精简并保留必要的开机自启动服务(如:crond, rsyslog, network, sshd, sysstat)
- Linux内核参数优化/etc/sysctl.conf,并执行sysctl -p 生效
- 更改系统字符集“zh_CN.UTF-8”,使其支持中文,防止出现乱码问题
- 锁定关键系统文件,如/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow, /etc/inittab , 处理以上内容后把chattr,lsattr改名为oldboy并转移,这样就安全多了
- 清空/etc/issue,/etc/issue.net,去除系统及内核版本登陆前的屏幕显示。
- 清除多余的系统虚拟用户账号
- 为grub引导菜单加密码