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基础优化与安全重点小结:

  1. 不用root登陆管理系统,而以普通用户身份登陆, 通过sudo授权管理。
  2. 更改默认的远程连接SSH服务器端口,禁止root用户远程连接,甚至更改SSH服务,只监听内网IP
  3. 定时自动更新服务器的时间,使其与互联网时间同步
  4. 配置yum更新源,从国内更新源下载安装包
  5. 关闭SELinux及iptables(在工作场景中,如果有外部IP一般要打开iptables,高并发、高流量的服务器可能无法开启)
  6. 调整文件描述符的数量,进程及文件的打开都会消耗文件描述符数量
  7. 定时自动清理邮件临时目录垃圾文件,防止磁盘的inodes数被小文件占满(注意centos5和6要清除的目录不同)
  8. 精简并保留必要的开机自启动服务(如:crond, rsyslog, network, sshd, sysstat)
  9. Linux内核参数优化/etc/sysctl.conf,并执行sysctl -p 生效
  10. 更改系统字符集“zh_CN.UTF-8”,使其支持中文,防止出现乱码问题
  11. 锁定关键系统文件,如/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow, /etc/inittab , 处理以上内容后把chattr,lsattr改名为oldboy并转移,这样就安全多了
  12. 清空/etc/issue,/etc/issue.net,去除系统及内核版本登陆前的屏幕显示。
  13. 清除多余的系统虚拟用户账号
  14. 为grub引导菜单加密码

更多优化:https://blog.51cto.com/oldboy/988726

https://blog.51cto.com/lspgyy/1308977

 

posted on 2019-11-23 17:51  Zoe233  阅读(233)  评论(0编辑  收藏  举报