CentOS系统的优化
优化之前,首先查看版本信息
# cat /etc/redhat-release CentOS release 6.7 (Final) # 系统版本信息 # uname –r 2.6.32-573.el6.x86_64 # 内核版本信息 # uname -m x86_64 #表示为64位系统 # uname –a # 显示全部信息 Linux hostname2.6.32-573.el6.x86_64 #1 SMP Thu Jul 23 15:44:03 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Linux基础优化与安全重点小结
1 不用root登录管理系统,而以普通用户登录通过sudo授权管理 2 更改默认的远程连接SSH服务端口,禁止root用户远程连接,甚至要更改SSH服务只监听内网IP 3 定时自动更新服务器时间,使其和互联网同步 4 配置yum更新源,从国内更新源下载安装软件包 5 关闭SELinux及iptables 6 定时自动清理邮件临时目录垃圾文件,防止磁盘inodes数被小文件占满 7 调整文件描述符的数量,进程及文件的打开都会消耗文件描述符的数量 8 精简并保留必要的开机启动服务 9 Linux内核参数优化/etc/sysctl.config,执行sysetl –p生效 10 更改系统字符集, 为“zh_CN.UTF-8”,使其支持中文,防止出现乱码问题。 11 锁定关键文件,如: passwd、/etc/shadow/、/etc/group/、/etc/gshadow、/etc/inittab,处理以上内容后把chattr、lsattr、改名为root,转移走,这样就安全多了。 12 清空/etc/issue /etcissue.net,去除系统及内核版本登录前的屏幕显示 13 清除多余的系统虚拟用户账号 14 为grub引导菜单加密码 15 禁止主机被ping 16 打补丁并升级有已知漏洞的软件
拓展
掌握Linux系统的7种运行级别。
1 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 2 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 3 运行级别2:多用户状态(没有NFS) 4 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式 5 运行级别4:系统未使用,保留 6 运行级别5:X11控制台,登陆后进入图形GUI模式 7 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
掌握Linux系统从开机到登录之前的启动流程。是由etc/inittab控制的
1. 使用阿里云镜像做样本源
默认国外的yum源比较慢,所以换成国内的。
1 # cd /etc/yum.repos.d/ 2 # ls 3 CentOS-Base.repo CentOS-Media.repo 4 CentOS-Debuginfo.repo CentOS-Vault.repo 5 CentOS-fasttrack.repo 6 # cp CentOS-Base.repo CentOS-Base.repo.ori 更改配置文件之前进行备份 7 # wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo centos6系统 8 # echo "192.168.14.200 mirrors.aliyun.com" >>/etc/hosts 公网地址换成内网地址 9 # yum -y install tree nmap sysstat lrzsz dos2unix telnet 安装必要的软件包(tree)
2. 关闭SELinux功能
1) 修改配置文件,使关闭SELinux永久生效:
l 第一种方法
1 # vim /etc/selinux/config 2 然后找到SELINUX=enforcing改成SELINUX=disabled 3 ESC:wq结束
l 第二种方法
1 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 2 sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config
2) 临时关闭SELinux,可在命令行执行如下命令:
1 [root@rootedu ~]# getenforce <--查看现在状态 2 3 Enforcing 4 5 [root@rootedu ~]# setenforce 6 7 usage: setenforce [ Enforcing | Permissive | 1 | 0 ] 8 9 [root@rootedu ~]# setenforce 0 <-- 临时将selinux调成下面的状态 10 11 [root@rootedu ~]# getenforce 12 13 Permissive
命令说明:setenforce:用于命令行管理SELinux的级别,
getenforce:查看SELinux当前级别
提示:修改配置SELinux后,要想其生效,必须要重启系统。再生产场景中不能随意重启系统。
3) 关闭iptables防火墙
l 临时关闭,关机之后会重新启动
1 /etc/init.d/iptables status <-- 查看看是否开启 2 /etc/init.d/iptables stop <-- 关闭防火墙
l 关闭开机自启动的防火墙
第一种方法
1 [root@rootedu ~]# chkconfig --list|grep ipt <-- 查看状态 2 iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off 3 [root@rootedu ~]# chkconfig iptables off <--下一次系统开启不运行防火墙 4 [root@rootedu ~]# chkconfig --list|grep ipt 5 iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off
第二种方法
1 /etc/init.d/iptables stop <--当前关闭防火墙 2 chkconfig iptables off <--关闭开机自启动命令
4) 设置运行级别为3(文本模式)
1 设定运行级别(runlevel)为3(一般安装系统后默认为3)即表示使用文本命令模式管理linux 2 3 grep 3:initdefault /etc/inittab <-- 检查命令 4 runlevel <--另一种简单方法 5 init 3 <--切换运行级别
5) 精简开机系统启动
1)系统开机必须要开启的服务
l sshd
远程连接linux服务器时需要用到这个服务程序,所以必须开启
l rsyslog
日志相关软件,
l network
网络服务
l crond
会周期的执行系统和用户配置的任务计划。
l sysstat
sysstat是一个软件包,包含检测系统性能及效率的一组工具.\
2)设置开启自启动服务的方法
手动关闭用setup
chkconfig --list|grep 3:on <--查看开机自启动的项目
第一种快速处理方法:先全关闭,再开启需要保留的。
操作思路:先将3级别文本模式下默认开启的服务都关闭,然后开启需要开启的服务。
操作命令如下:
1 LANG=en 2 for root in `chkconfig --list|grep 3:on|awk '{print $1}'`;do chkconfig --level 3 $root off;done 3 for root in crond network rsyslog sshd sysstat ;do chkconfig --level 3 $root on;done 4 chkconfig --list|grep 3:on
第二种快速处理方法
1 for root in `chkconfig --list|grep "3:on"|awk '{print $1}'|grep -vE "crond|network|sshd|rsyslog|sysstat"`;do chkconfig $root off;done
第三种快速处理方法(逼格最高)
chkconfig --list|grep 3:on|grep -vE "crond|sshd|network|rsyslog|sysstat " |awk '{print "chkconfig " $1 " off"}'|bash
6) 添加普通用户账号
linux/unix是一个多用户,多任务的操作系统
超级管理员(root):拥有最高权限
普通用户
l 一条命令设置密码
echo '123456'|passwd --stdin root <--root用户名,密码为123456
| 使用命令添加一个普通用户,命令如下:
1 useradd root <--添加用户 2 passwd root <--设置用户密码
l 尝试切换用户角色,命令如下:
1 [root@hostname ~]# su – root <--由root管理员,切换到普通用户root 2 [root@hostname ~]$ whoami <--查看当前用户 3 root 4 [root@hostname ~]$ su - <--切到root用户 5 Password:
l linux命令提示符由PS1环境变量
查看环境变量: echo $PS1
7) 利用sudo控制用户的使用权限
为了方便管理,可以给用户授权,过程:输入vi sudoers找到98行,在下面放入如下内容:
oldboy ALL=(ALL) NOPASSWD: ALL <--all表示完全的系统权限,NOPASSWD表示提示权限命令时不需要密码
配置完成后要进行检查,命令如下:
[oldboy@hostname ~]# grep root /etc/sudoers oldboy ALL=(ALL) NOPASSWD: ALL
此时再以oldboy用户登录系统时,就可以通过执行sudo ls –l /root (sudo后面跟正常命令)的命令以root用户的权限管理系统了,如下:
[oldboy@hostname ~]$ ls /root/ ls: cannot open directory /root/: Permission denied [oldboy@hostname ~]$ sudo ls /root/ HostKeyDB.txt test.txt 12345 install.log woaini
8) Linux系统安全最小化原则说明
a) 安装Linux系统最小化,即选包最小化。
b) 开机自启动服务最小化,即不用的服务不开启。
c) 操作命令最小化。
d) 登录Linux用户最小化。平时没有特殊需要就用普通用户登录即可。
e) 普通用户授权权限最小化。只给用户必要的管理系统的命令。
f) Linux系统文件及目录的权限设置最小化。禁止随意创建,更改,删除文件。
g) 程序服务运行最小化,即程序服务运行尽量不用root身份进行。
9) 更改SSH服务端远程登录的配置
windows服务器的默认远程管理端口是3389,管理员用户是administrator,普通用户guest。Linux管理用户是root,远程连接默认端口port22。
1 [root@hostname ~]#cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ori <--备份配置文件,简单写法cp /etc/ssh/sshd_config{,.ori}
2 [root@hostname ~]# vim /etc/ssh/sshd_config
3 进入17行加入:
4 ####by root#2011-11-24##
5 rt 52113
6 PermitRootLogin no
7 PermitEmptyPasswords no
8 UseDNS no
9 GSSAPIAuthentication no
10 ####by root#2011-11-24##
11 /etc/init.d/sshd reload <--reload为平滑重启,不会影响正在SSH连接的其他用户,restart直接断开生效
然后就连不上了,因为端口改了。
然后更改会话选项里的SSH2里的端口还有用户名。就OK了
10) Linux中文显示设置
此选项为优化可选项,即调整Linux系统的字符集设置。
简单的说,字符集就是一套文字符号及其编码。目前linux下常用的字符集有:
GBK:定长双字节
UTF-8:非定常,1~4字节,广泛支持
临时生效,命令:LANG=”zh_CN.UTF-8’
永久生效,可以通过快捷的命令方式在/etc/sysconfig/i18n中添加如下内容,使其支持中文显示:
1 [root@hostname ~]# echo $LANG 2 en_US.UTF-8 3 [root@hostname ~]# cat /etc/sysconfig/i18n 4 LANG="en_US.UTF-8" 5 SYSFONT="latarcyrheb-sun16" 6 [root@hostname ~]# cp /etc/sysconfig/i18n /etc/sysconfig/i18n.ori 7 [root@hostname ~]#echo ‘LANG=”zh_CN.UTF-8”’>/etc/sysconfig/i18n 8 [root@hostname ~]#source /etc/sysconfig/i18n <--使其生效 9 [root@hostname ~]#echo $LANG 10 zh_CN.UTF-8
11) 设置linux服务器时间同步
1 ntpdate time.nist.gov<--时间同步 2 ntpdate ntp1.aliyun.com<--国内阿里云时间同步服务器 3 利用定时任务crond把上述命令每5分钟自动执行一次,命令如下: 4 5 echo '#time sync by root at 2010-2-1' >>/var/spool/cron/root 6 echo '*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1' >>/var/spool/cron/root 7 crontab –l 8 [root@rootedu ~]# crontab -l 9 #time sync by root at 2010-2-1 10 */5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
12) 历史记录数及登录超时环境
1.设置闲置账号超时时间,命令如下,此处为临时生效
export TMOUT=10 <--设置连接会话的超时时间
2.设置Linux的命令行历史记录数, 命令如下,此处为临时生效
1 export HISTSIZE=5 2 export TMOUT=10 连接的超时时间控制变量。 3 4 export HISTSIZE=5 命令行的历史记录数量变量。 5 export HISTFILESIZE=10 历史记录文件的命令数量变量(~/.bash_history)。
13) 调整Linux系统描述符数量和最大进程数
系统描述符
先用ulimit –n查看有几个描述符,规则是“软(soft)”或“硬(hard)”
对于高并发的业务Linux服务器来说,默认的设置值是不够的,需要调整
调整方法:
执行vim /etc/security/limits.conf再文件结尾加上如下一行(全局) * - nofile 65535
或者直接执行下面的命令
1 echo '* - nofile 65535 ' >>/etc/security/limits.conf 2 tail -4 /etc/security/limits.conf <--查看文件最后4行 3 [root@rootedu tmp]# ulimit –n <--查看是否生效 4 65535
总结:
1 临时生效 ulimit -SHn 65535 2 永久生效 echo '* - nofile 65535 ' >>/etc/security/limits.conf 3 或者: 4 cat /etc/security/limits.conf 5 * soft nofile 65536 6 * hard nofile 65536
最大线程数
ulimit -a
max user processes (-u) #系统限制某用户下最多可以运行多少进程或线程
root 账号下 ulimit -u 出现的max user processes 的值默认是 # cat /proc/sys/kernel/threads-max的值/2,即系统线程数的一半
普通账号下 ulimit -u 出现的max user processes的值 默认是 /etc/security/limits.d/20-nproc.conf(centos6 是90-nproc.conf) 文件中的
1.在/etc/security/limits.conf文件里添加如下内容:
1 echo "* soft nproc 65535" >> /etc/security/limits.conf 2 echo "* hard nproc 65535" >> /etc/security/limits.conf
注意:修改这里,普通用户 max user process值是不生效的,需要修改/etc/security/limits.d/20-nproc.conf文件中的值。或者90-nproc.conf
如果使用*号让全局用户生效是受文件/etc/security/limits.d/20-nproc.conf中nproc值大小制约的,而如果仅仅是针对某个用户,那么就不受该文件nproc值大小的影响。
2.修改 /etc/security/limits.d/20-nproc.conf
因为普通用户受这个文件里的值影响
修改为:
* soft nproc 65535
3.系统总限制
其实上面的 max user processes 65535 的值也只是表象,普通用户最大进程数无法达到65535 ,因为用户的max user processes的值,最后是受全局的kernel.pid_max的值限制。也就是说kernel.pid_max=1024 ,那么你用户的max user processes的值是127426 ,用户能打开的最大进程数还是1024。
cat /proc/sys/kernel/pid_max
# sysctl kernel.pid_max kernel.pid_max = 32768
修改这个值方法:
1 # vim /etc/sysctl.conf 2 kernel.pid_max = 65535 3 或者: 4 echo "kernel.pid_max = 65535" >> /etc/sysctl.conf
14)linux服务器内核参数优化
优化的方法
1 cat>>/etc/sysctl.conf<<EOF 2 net.ipv4.tcp_fin_timeout = 2 3 net.ipv4.tcp_tw_reuse = 1 4 net.ipv4.tcp_tw_recycle = 1 5 net.ipv4.tcp_syncookies = 1 6 net.ipv4.tcp_keepalive_time = 600 7 net.ipv4.ip_local_port_range = 4000 65000 8 net.ipv4.tcp_max_syn_backlog = 16384 9 net.ipv4.tcp_max_tw_buckets = 36000 10 net.ipv4.route.gc_timeout = 100 11 net.ipv4.tcp_syn_retries = 1 12 net.ipv4.tcp_synack_retries = 1 13 net.core.somaxconn = 16384 14 net.core.netdev_max_backlog = 16384 15 net.ipv4.tcp_max_orphans = 16384 16 net.nf_conntrack_max = 25000000 17 net.netfilter.nf_conntrack_max = 25000000 18 net.netfilter.nf_conntrack_tcp_timeout_established = 180 19 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 20 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 21 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 22 EOF
然后用sysctl –p使其生效
然后vimdiff /etc/sysctl.conf /etc/sysctl.conf.ori 更改的文件与拷贝的文件对比
15) 隐藏Linux版本信息显示
登录后执行如下命令,显示其实际存放内容
1 [root@rootedu ~]# cat /etc/issue <--查看当前主机信息 2 CentOS release 6.7 (Final) 3 Kernel \r on an \m 4 [root@rootedu ~]# uname -r 5 2.6.32-573.el6.x86_64 6 [root@rootedu ~]# uname -m 7 x86_64
执行以下命令清除系统版本及内核信息(清空就好,不用删除)
>/etc/issue <--清空 >/etc/issue.net <--清空
cat /etc/redhat-release(需要的情况,能过内部其它文件还是可以查到)
16) 锁定关键系统文件,防止提权被篡改(可选)
要锁定关键系统文件,必须对账号密码及启动文件加锁,防止被篡改。上锁命令如下
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
提示:上锁后,所有用户都不能对文件进行修改
解锁:chattr -i
17) 清除多余的系统虚拟账号(可选)
操作前要先根据公司系统提供的服务确定那些账号不需要使用,如果不确定就不要操作了,一般情况下,一个规范的系统提供的服务都比较少,因此,系统中默认的绝大多数虚拟用户都是可以删除掉的(不直接删除,注释即可)。
18) 为grub菜单加密码(可选)
为grup菜单加密码的目的是防止他人修改grup做内核等启动设置,以及用单用户模式启动破解root密码等做操作。也可以在安装系统过程中设定。
流程:
1)先用/sbin/grup-crypt产生一个MD5密码串
2)修改grup.conf文件
3)重启生效
可以在安装过程中设定.
19) 禁止Linux系统被ping(可选)
此优化项从安全角度,禁止ping会增加系统安全,但是我们自己也会通过ping来检查服务器是否异常,所以这不是一个好方法,不建议使用。
比较好一点的是通过iptabies设置让特定的IP可以ping.
禁止ping的命令如下:
1 echo “net.ipv4.icmp_echo_ignore_all=1” >> /etc/sysctl.conf <--禁止ping 2 tail -1 / etc/sysctl.conf <--查看 3 sysctl -p <--生效 4 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all <--临时ping不通 5 echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all <--临时还原的方法
20) 升级具有典型漏洞的软件版本
步骤
1)查看相关软件的版本号
[root@rootedy ~]# rpm -qa openssl openssl-1.0.1e-42.el6_7.4.x86_64
2)执行升级已知漏洞的软件版本到最新
[root@rootedy ~]# yum install openssl -y Loaded plugins: fastestmirror, security Setting up Install Process Determining fastest mirrors * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com base | 3.7 kB 00:00 extras | 3.4 kB 00:00 updates | 3.4 kB 00:00 updates/primary_db | 5.2 MB 00:22 Package openssl-1.0.1e-42.el6_7.4.x86_64 already installed and latest version Nothing to do