CentOS 7 系统调优以及安全设置

1.修改ip地址、网关、主机名解析、DNS等。

在系统安装完成后,需要配置网络环境,当然这一步骤也可以在安装系统的过程中进行设置。

# 修改主机名 修改/etc/hostname文件,将主机名改成想要的主机名
vi /etc/hostname
# 修改主机名解析,在/etc/hosts文件中,将127.0.0.1 后面对应新的主机名
vi /etc/hosts
# 修改IP地址、网关、DNS,通过修改网关配置文件进行
vi /etc/sysconfig/network-scripts/ifcfg-eth0
# 对相关字段进行修改进行配置变更
BOOTPROTO=static            # static/none为静态   DHCP为动态
ONBOOT=yes                  # 开机自启动
IPADDR=10.0.0.200           # IP地址
PREFIX=24                   # 子网掩码,等同于255.255.255.0
GATEWAY=10.0.0.2            # 网关
DNS1=114.114.114.114        # DNS服务器

2.关闭selinux,关闭firewalld

2.1 关闭selinux

# 关闭selinux
vi /etc/sysconfig/selinux	

# This file controls the state of SELinux on the system.
# 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=disabled       
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

3.2 关闭防火墙

# 查看防火墙服务状态
systemctl status firewalld       
# 临时关闭防火墙服务
systemctl stop firewalld
# 永久关闭防火墙服务
systemctl disable firewalld
       
# 补充: 查看服务状态信息简便方法
systemctl is-active firewalld   --- 检查服务是否正常运行
systemctl is-enabled firewalld  --- 检查确认服务是否开机运行

3.更改SSH服务器端远程登录的配置

# 修改配置文件sshd_config
vi /etc/sshd/sshd_config

Port 52113                 # 指定sshd守护进程的端口号,默认是22;建议自定义端口号在1024~65535之间,不能与已有的服务器端口冲突。
PermitRootLogin no         # 是否允许root用户登录。建议不允许“no”
PermitEmptyPasswords no    # 是否允许密码为空的用户远程登录
UseDNS no                  # 指定sshd是否应该对远程主机名进行反向解析,以检查主机名是否与IP地址真是对应。影响连接速度
GSSAPIAuthentication no    # 是否允许使用基于GSSAPI的用户认证。影响连接速度

配置文件修改完成后,重新加载配置文件:systemctl reload sshd 或 systemctl restart sshd。

reload的重新加载是平滑加载,不影响SSH连接的其他用户,比restart要好。

4.设置运行级别、精简开机自启动

4.1 设置运行级别

可以使用命令:runlevel  查看当前系统运行级别

如果安装的是桌面程序版本的系统,系统的运行级别为N 5。可以使用命令:init 3  切换运行级别

设置默认开机运行级别

# 查看默认运行级别
systemctl get-default              

# 设置默认级别是3
systemctl set-default multi-user.target

#设置默认级别是5
systemctl set-default graphical.target 

4.2 精简开机自启动

企业环境新装CentOS Linux之后,建议保留开机自启动有这五个。

  • sshd:远程连接需要使用到的服务程序
  • rsyslog:日志相关软件服务程序
  • network:网络接口状态变更服务程序
  • crond:定时任务服务,适用于周期性的执行系统以及用户配置的任务计划
  • sysstat:软件包,包含监测系统性能及效率的一组工具。
4.2.1 使用ntsysv软件,进行图形化窗口设置

该软件可以在命令行中使用命令:ntsysv 进行启用。如果没有该软件可以使用yum源安装:yum  install  ntsysv  -y

使用命令进入到该界面,进行设置服务的开机自启动。

具体操作方法:

上下键:可以在方框中的各个服务之间进行移动;

空格键:可以用来选择所需要的服务,【*】表示开启自启动;

Tab键:可以在服务界面、确认按钮、取消按钮之间进行选择移动;

F1键:显示服务说明

4.2.2 通过命令或shell脚本设置
# 因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权
chmod +x /etc/rc.d/rc.local

# 赋予脚本可执行权限,假设/usr/local/script/autostart.sh是你的脚本路径,给予执行权限
chmod +x /usr/local/script/autostart.sh

# 打开/etc/rc.d/rc.local文件,在末尾增加如下内容
/usr/local/script/autostart.sh

5 更新yum源及必要软件安装(以阿里源为例)

首先对原有yum源进行备份,之后再进行后续操作

# 首先备份/etc/yum.repos.d/CentOS-Base.repo
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 进入yum源配置文件所在文件夹
cd /etc/yum.repos.d/

# 下载阿里的yum源配置文件,放入/etc/yum.repos.d/(操作前请做好相应备份)
wget http://mirrors.aliyun.com/repo/Centos-7.repo

# yum clean all 清除缓存,运行 yum makecache 生成新的缓存
yum clean all
yum makecache

# 安装EPEL(Extra Packages for Enterprise Linux )源
yum install -y epel-release

# 再次执行yum clean all 清除缓存,运行 yum makecache 生成新的缓存

# 查看启用的yum源和所有的yum源
yum repolist enabled
yum repolist all

# 更新系统(时间比较久,主要看个人网速)
yum -y update

6 调整字符集以及命令行提示符调整

6.1 调整字符集,支持中文

# 查看当前字符集
[root@localhost etc]# echo $LANG
en_US.UTF-8
*********************************************
# 修改字符集配置文件
[root@localhost etc]# vi /etc/locale.conf

# LANG="en_US.UTF-8"
LANG="zh_CN.UTF-8"

6.2 命令行提示符调整

命令行提示符的相关调整是关系到环境变量“PS1”。所以说可以通过修改环境变量PS1来改变命令行提示符.

# 默认结构
[root@localhost ~]# echo $PS1
[\u@\h \W]\$

\d :#代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :#完整的主机名称
\h :#仅取主机的第一个名字
\t :#显示时间为24小时格式,如:HH:MM:SS
\T :#显示时间为12小时格式
\A :#显示时间为24小时格式:HH:MM
\u :#当前用户的账号名称
\v :#BASH的版本信息
\w :#完整的工作目录名称
\W :#利用basename取得工作目录名称,所以只会列出最后一个目录
\# :#下达的第几个命令
\$ :#提示字符,如果是root时,提示符为:# ,普通用户则为:$


# 颜色调整,在环境配置文件里添加变量值
[root@oldboyedu ~]# vi /etc/profile
export PS1='\[\e[32;1m\][\u@\h \W]\$ \[\e[0m\]'
                       设置颜色    内容         结束     
    
    export PS1='\[\e[30;1m\][\u@\h \W]\$ \[\e[0m\]'  -- 黑色提示符
    export PS1='\[\e[31;1m\][\u@\h \W]\$ \[\e[0m\]'  -- 红色提示符
    export PS1='\[\e[32;1m\][\u@\h \W]\$ \[\e[0m\]'  -- 绿色提示符
    export PS1='\[\e[33;1m\][\u@\h \W]\$ \[\e[0m\]'  -- 黄色提示符
    export PS1='\[\e[34;1m\][\u@\h \W]\$ \[\e[0m\]'  -- 蓝色提示符
    export PS1='\[\e[35;1m\][\u@\h \W]\$ \[\e[0m\]'  -- 粉色
    export PS1='\[\e[36;1m\][\u@\h \W]\$ \[\e[0m\]'  -- 浅蓝 
    export PS1='\[\e[37;1m\][\u@\h \W]\$ \[\e[0m\]'  -- 白色

7. 内核参数优化

编辑内核参数配置文件/etc/sysctl.conf。

注意CentOS 6 中,配置文件参数都在这个文件中;CentOS7中,可以配置参数在该文件中,也可以根据提示将参数配置在其他文件中。

# 值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开
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

# 开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies 来处理
net.ipv4.tcp_syncookies = 1

# 确定一个消息队列的容量。该参数的取值存储在消息队列标识符结构的某个域中,用于确定是否存在着对新消息进行排队的空间。msgmnb 值可以动态修改,默认为16384。修改其取值会影响到所有新的消息队列的容量。用户可以通过 Msgctl()系统调用来增加现有消息队列的容量
kernel.msgmnb = 65536

# 限制进程可以发送的消息长度。该参数由 Msgsnd()函数加以应用。如果待发送消息的长度超过该值,则返回一个错误。该参数可以在运行时调整
kernel.msgmax = 65536

# 最大共享内存段大小。取物理内存大小的一半,单位为字节(此处为8G)
kernel.shmmax = 8589934592

# 整个系统共享内存段的最大数目
kernel.shmmni = 4096

# 可以使用的共享内存的总量
kernel.shmall = 4294967296

# 每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操作数;系统范围内最大信号对象集数
kernel.sem = 250 32000 100 128

# timewait 的数量,默认是180000
net.ipv4.tcp_max_tw_buckets = 204800

# web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值
net.core.somaxconn = 262144

# 该参数标识是否启用选择性确认SACKS选项。默认值为1(true)
net.ipv4.tcp_sack = 1

# 设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力
net.ipv4.tcp_window_scaling = 1

# tcp_rmem:min表示为TCP socket预留用于接收缓冲的最小内存数量,default为TCP socket预留用于接收缓冲的缺省内存数量,max用于TCP socket接收缓冲的内存最大值
net.ipv4.tcp_rmem = 4096 87380 4194304

# tcp_wmem:min表示为TCP socket预留用于发送缓冲的内存最小值,default为TCP socket预留用于发送缓冲的缺省内存值,max用于TCP socket发送缓冲的内存最大值
net.ipv4.tcp_wmem = 4096 16384 4194304

# 系统套接字写默认缓冲区
net.core.wmem_default = 8388608

# 系统套接字读默认缓冲区
net.core.rmem_default = 8388608

# 系统套接字读最大缓冲区
net.core.rmem_max = 16777216

# 系统套接字写最大缓冲区
net.core.wmem_max = 16777216

# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144

# 统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 3276800

# 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M 内存的系统而言,缺省值是1024,小内存的系统则是128
net.ipv4.tcp_max_syn_backlog = 262144

# 时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉
net.ipv4.tcp_timestamps = 0

# 为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量
net.ipv4.tcp_synack_retries = 1

# 在内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 1

# 启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1

# 开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
net.ipv4.tcp_tw_reuse = 1

# 确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)
net.ipv4.tcp_mem = 94500000 915000000 927000000

# 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180 秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些
net.ipv4.tcp_fin_timeout = 15

# 当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 15

# 允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65000

# 系统中所允许的文件句柄最大数目
fs.file-max = 204800

修改完成后,使用命令:sysctl -p 让参数生效。

8. 定时更新服务器时间、定时清理日志文件

8.1 定时同步服务器时间

有两种方法都比较简单,大致流程就是“设置时区” -> “同步时间” -> “设置定时任务”。

# 查看当前时区。
# 已经是Asia/Shanghai,则无需设置
[root@localhost ~]# timedatectl status|grep 'Time zone'
       Time zone: Asia/Shanghai (CST, +0800)
       
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 执行下面的命令设置时区
# 设置硬件时钟调整为与本地时钟一致
timedatectl set-local-rtc 1
# 设置时区为上海
timedatectl set-timezone Asia/Shanghai
8.1.1 使用ntpdate同步时间
#安装ntpdate
yum -y install ntpdate
#同步时间
ntpdate -u  pool.ntp.org
#同步完成后,date命令查看时间是否正确
date

# 几个常用的ntp server
cn.ntp.org.cn     #中国
hk.ntp.org.cn     #中国香港
us.ntp.org.cn     #美国

同步时间后可能部分服务器过一段时间又会出现偏差,因此设置crontab来定时同步时间,方法如下:

#安装crontab
yum -y install crontab
#创建crontab任务
crontab -e
#添加定时任务
*/20 * * * * /usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1
#重启crontab
systemctl reload crond.service

# 上面的计划任务会在每20分钟进行一次时间同步,
# 注意/usr/sbin/ntpdate为ntpdate命令所在的绝对路径,
# 不同的服务器可能路径不一样,可以使用which命令来找到绝对路径,方法如下:

[root@xiaoz ~]# which ntpdate
/usr/sbin/ntpdate
8.1.2 使用rdate同步时间
#安装rdate
yum -y install rdate
#同步时间
rdate -s time-b.nist.gov
#查看时间是否正确
date

# 其他服务器选择
s1d.time.edu.cn #东南大学
s1e.time.edu.cn #清华大学
s2a.time.edu.cn #清华大学
s2b.time.edu.cn #清华大学
s2c.time.edu.cn #北京邮电大学
ntp.sjtu.edu.cn 202.120.2.101 #(上海交通大学网络中心NTP服务器地址)
s1a.time.edu.cn #北京邮电大学
s1b.time.edu.cn #清华大学
s1c.time.edu.cn #北京大学
clock.cuhk.edu.hk #香港中文大学授时中心

 加入定时任务来定期同步时间

#安装crontab
yum -y install crontab
#创建crontab任务
crontab -e
#添加定时任务
*/20 * * * * /usr/bin/rdate -s time-b.nist.gov > /dev/null 2>&1
#重启crontab
systemctl reload crond.service

 总结:ntpdate服务需要使用udp/123端口,但是某些服务商禁止了所有UDP协议,所以你会发现无论如何ntpdate总是同步出错,但使用rdate命令却可以。

8.2 定时清理日志文件

案例:定时清理15日之前的日志。

# 手动执行命令删除日志

find /opt/web/log/ -mtime +15 -name "*.log.*" -exec rm -rf {} \;


# 命令解析:
# 将目录/opt/web/log/下15天前文件后缀为.log的文件删除

1. find:          linux的查找命令,用户查找指定条件的文件;
2. /opt/web/log/: 想要进行清理的任意目录;
3. -mtime:        标准语句写法;
4. +15:           查找15天前的文件,这里用数字代表天数;
5. "*.log":       希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三;
6. -exec:         固定写法;
7. rm -rf:        强制删除文件,包括目录;
8. {} \; :        固定写法,一对大括号+空格+\+;

编写脚本文件,使用脚本执行删除日志的任务。

# 创建文件:
touch  del-15-days-ago-log.sh

# 开启权限:
chmod -x  del-15-days-ago-log.sh

# 编辑文件:
vim del-15-days-ago-log.sh

# 写入脚本:
find /opt/web/log/ -mtime +15 -name "*.log.*" -exec rm -rf {} \;

# 执行脚本清除日志:
del-15-days-ago-log.sh

添加定时任务,计划每天凌晨0点10分执行脚本自动清除日志

# 执行命令:
crontab -e

# 写入命令:
10 0 * * * /opt/web/del-15-days-ago-log.sh >/dev/null 2>&1

9. 设置开机提示信息

常用的是登录后显示提示信息,即远程连接之后在进入命令行之前显示的内容。

这种方法不仅在 ssh 输入密码成功登录后显示,而且在普通登录成功后也会显示。

方法:修改 /etc/motd 文件,定义 ssh 成功登录后的欢迎信息。

vi /etc/motd

# 在这个文件中添加的内容将会进行显示
********************运维工作流程***********************
	01. 准备/检查好环境
	02. 进行操作前的备份(退路)
	03. 进行配置之后注意保存
	04. 配置完成需要检查 
    05. 编写项目文档	
*******************************************************

登录后显示为:

10.调整Linux系统文件描述符数量

10.1 文件描述符文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件。文件描述符与包括相关信息(文件的打开模式,文件的位置类型,文件的出始类型等)的文件对象相关联,这些信息被称作文件的上下文。文件描述符的有效范围是0到OPEN_MAX。

  • 对于内核而言,所有打开的文件都是通过文件描述符引用的,当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或create返回的文件描述符标识该文件,并将其作为参数传递给read或write。
  • 操作系统通常给每个进程能打开的文件数量强加一个限制。而这个限制数对于一部分服务来讲是不够用的,所以需要我们来修改这个最大限制数。
  • linux下最大文件描述符的限制有两个方面,一个是用户级的限制,另外一个则是系统级限制。

10.2 查看Linux文件描述符的方式

# 查看系统级限制
[root@localhost ~]# sysctl -a | grep -i file-max --color
fs.file-max = 392036

[root@localhost ~]# cat /proc/sys/fs/file-max
392036

# 查看用户级限制
[root@localhost ~]# ulimit -n
1024

系统级限制:sysctl命令和proc文件系统中查看到的数值是一样的,这属于系统级限制,它是限制所有用户打开文件描述符的总和
用户级限制:ulimit命令看到的是用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制

10.3 修改文件描述符的值

10.3.1 修改用户级限制
# 临时修改,只对当前会话起作用
[root@localhost ~]# ulimit-SHn 10240
[root@localhost ~]# ulimit  -n
10240

# 永久修改
[root@localhost ~]# grep -vE'^$|^#' /etc/security/limits.conf
*                hard nofile                  4096

# 默认配置文件中只有hard选项,soft 指的是当前系统生效的设置值,hard 表明系统中所能设定的最大值
[root@localhost ~]# grep -vE'^$|^#' /etc/security/limits.conf
*      hard         nofile       10240
*      soft         nofile      10240

soft <= hard soft的限制不能比hard限制高
10.3.2 修改系统限制
# 临时修改文件描述符
[root@localhost ~]# sysctl -wfs.file-max=400000
fs.file-max = 400000
[root@localhost ~]# echo350000 > /proc/sys/fs/file-max  //重启后失效
[root@localhost ~]# cat /proc/sys/fs/file-max
350000

# 永久修改
把fs.file-max=400000添加到/etc/sysctl.conf中,使用sysctl -p即可

11. 历史记录数及登录超时环境变量设置

1.设置闲置账号超时时间,临时生效。

[root@localhost ~]# export TMOUT=10 
[root@localhost ~]#  
timed out waiting for input: auto-logout#???10秒提示超时 

2.设置Linux的命令行历史记录数,仅临时生效。

[root@localhost ~]# export HISTSIZE=5 
[root@localhost ~]# history  
   42  whoami  
   43  TMOUNT=10#?连接的超时时间  
   44  TMOUT=10 
   45  HISTSIZE=5 
   46  history

设定用户的命令行历史记录文件(~/.bash_history)记录指定命令数量的示例命令如下,仅临时生效

[root@localhost ~]# export HISTFILESIZE=5 
[root@localhost ~]# cat ~/.bash_history  
ifdown eth0  
ls  
ls  
rz  
ls    # ???可以看到文件里记录命令的数量也变少了 

把上述命令放入配置文件,使其可以配置变量生效,命令如下。

[root@localhost ~]# vi /etc/profile

或

[root@localhost ~]# echo 'export TMOUT=300' >>/etc/profile  
[root@localhost ~]# echo 'export HISTSIZE=5' >>/etc/profile  
[root@localhost ~]# echo 'export HISTFILESIZE=5' >>/etc/profile  


[root@localhost ~]# tail -3 /etc/profile  
export TMOUT=300 
export HISTSIZE=5 
export HISTFILESIZE=5 
[root@www ~]# source /etc/profile      #  ???使得配置文件生效

在上述命令中,涉及的系统控制变量说明如下。

TMOUNT=10:连接的超时时间控制变量。

HISTSIZE=5:命令行的历史记录数量变量。

HISTFILESIZE=10:历史记录文件的命令数量变量(~/.bash_history)。

提示:实际工作中类似的变量还有不少,大家可以根据企业工作需求选择使用,***执行前加上export命令。更多Linux系统的环境变量,大家可以执行man bash查询。

12. 锁定关键系统文件,防止被提权篡改 

要锁定关键系统文件,必须对账号密码文件及启动文件加锁,防止被篡改。

上锁命令如下:

chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab 

PS:上锁后,所有用户都不能对文件修改删除。

解锁的命令如下:

chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab 

PS:上锁后,如需临时操作,可以解锁后对文件进行修改,之后再上锁。

如果想更加安全,可以把chattr改名转移,防止被黑客利用。命令如下:

[root@localhost ~]# mv /usr/bin/chattr /usr/bin/oldboy1  
[root@localhost ~]# chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab  
-bash: /usr/bin/chattr: 没有那个文件或目录  
[root@localhost ~]# oldboy1 -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab  
[root@localhost ~]# lsattr /etc/passwd ??查看被上锁后的文件属性  
----i--------e- /etc/passwd  

# 提示:chattr有很多参数,例如-a等,如果读者要了解更多,请执行man chattr查看 
posted @ 2021-06-20 12:29  两口猪头肉OVO  阅读(1523)  评论(0编辑  收藏  举报