柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

Centos 6.4 初装后的基础优化

        运维工作会经常面临着服务器上架的情况,服务器第一步当然是最小化安装,第二步就是要优化了,不优化的操作系统是不能交付使用的,那就是给自己运维工作添堵啊。我现在的运维工作基本都是脚本自动化执行,这里我就把我脚本里面的东西在这里写成博客与大家分享一下。

      

这些优化基本与其他一些博客里面的优化大致相同,这都是大家的经验总结嘛,撑死是表述有些差别,但是内部的意思是差不多的。

好了,我这里以Centos 6.4 64位的操作系统举例,Centos 5.8的优化跟这个差不多,细节上有区别,在博客中会有意的点一下。

1.优化第一步:精简开机自启动服务

先扯两句,为什么要精简开机自启动服务呢,服务起的越多系统就越危险,也不方便维护管理当你服务器运行一段时间安装的东西你就分不清哪些进程是有用的那些事没用的了,到时候想关进程都不敢关了。还有当你系统被入侵时候你就知道了,当你系统被入侵的时候你想看又什么异常进程,到时候运行的程序太多了,乱的很排查起来很费劲,所以一定要精简开机启动。

LANG=en #我们默认安装系统是支持中文的所以是中文字符集,得先这样搞一下不然下面的命令不起作用

for sun in `chkconfig –list|grep 3:on|awk ‘{print $1}’`; do chkconfig –level 35 $sun off;done

#我们先将所有的服务器都变为开机不启动

for system in crond sshd network  rsyslog ;do chkconfig –level 35 $system on;done  #然后我们将我们制定要启动的服务添加为开机启动,注意Centos 5.8要将rsyslog改为syslog

yh1.png

2. 优化第二步:关闭selinux

先扯两句,selinux是个很鸡肋的东西,这个东西是人家外国研究出来保护系统安全的,但是在咱们国内,这个服务对于咱们来说吧很恶心,因为我们在安装东西的时候经常会莫名的出错,配置啥的都没问题,后来selinux一关就OK了。所以,不就有这句口头禅嘛,你问别人我这个服务咋不成呢,经常会得到两个反问,是不是防火墙设置有问题,selinux关了没。

sed -i “s#SELINUX=enforcing#SELINUX=disabled#g” /etc/selinux/config #一般我们第一次优化完之后是要重启的,所以执行到这里就可以了,但是有很多哥们是服务器运行之后才关selinux,所以就需要下面的命令了。
[root@client ~]# getenforce   #我们先用这个命令查看自己的selinux是否为启动状态
Enforcing  #这表示是启动的

[root@client ~]# setenforce 0   #这个命令,就是将selinux的级别变成了Permissive
[root@client ~]# getenforce    #我们查看级别变了,其实这只是忽略,现在基本就没啥影响了。
Permissive    #这个就是处于开启和关闭中间的那个级别

ps:所以我们还是要更改配置文件,等着有机会重启服务器,就彻底关了selinux了

[root@client ~]# cat /etc/selinux/config#下面是截取的部分内容,注意是三个级别

#     enforcing – SELinux security policy is enforced.
#     permissive – SELinux prints warnings instead of enforcing.
#     disabled – No SELinux policy is loaded.

3. 优化第三步:更改yum源

如果是集群环境我建议还是自建yum源服务器吧,我前面的博客也有写,就在yum源里面放一些自己需要的软件就行,我们公司就是自建yum源服务器为百台服务器服务。而且我们大部分服务器是内网服务器并不能出网的,所以自建本地yum源服务器是很有必要的。我前面已经有博客写到了如何自建本地yum源和其他服务器如何设置这里就不多说了。

下面是面对很多服务器可能比较少,就采用国内yum源服务器就行。

我们偶然要yum安装东西,这个Centos默认是国外的yum源,这样下载多少会有影响,这个还不是很明显,如果用过git的就知道不换成淘宝的镜像站,很多东西下载如蜗牛,鄙人维护过一年的git是深有体会啊。国内比较知名的的yum源站点是sohu和163,我这里就用163的yum源举例吧,不过搭建过公网yum源服务器的就知道了,就是把人家国外的镜像站rsync一份供国内使用。

cd /etc/yum.repos.d/
/bin/mv  CentOS-Base.repo  CentOS-Base.repo.bak20150418
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo

yum clean all #清空yum缓存

yum makecache  #建立yum缓存

至此,yum源更换操作完毕,自己yum一个软件测试一下是否成功了。

4. 优化第三步:安装几个必要的好用的软件

yum install lrzsz ntpdate sysstat tree -y

#lrzsz 是一个很好用的上传下载软件,但是CRT用这个传输大文件有问题,Xshell传输大文件没问题

#ntpdate 是时间同步的软件,一般系统都会装,安装一下以防万一,以后都是脚本话,尽量不单机操作

#tree 是一个很好的看目录结构的软件,最小化安装系统一般不带这个工具的

#sysstat是用来检测系统性能及效率的工具,主要是用iostat看CPU啊看磁盘IO啊

5. 优化第五步:添加定时任务服务器进行时间同步

我们一般都会自建ntp时间服务器,因为集群里面有大量的不能上外网的服务器需要进行时间同步,博客也有文章来讲,这里就以同步公网的时间服务器举例。

 echo '*/30 * * * * /usr/sbin/ntpdate time.nist.gov ;hwclock–w  >/dev/null 2>&1' >>/var/spool/cron/root  #hwclock–w 同步时间并写入blos硬件时间

#Centos 5系列的命令全路径是/sbin/ntpdate

6. 优化第六步:优化ssh登录策略

我们一般在操作前,要多打开一个窗口以防止操作出问题,出问题还能在备窗口上进行修改。

vi /etc/ssh/sshd_config #修改一些配置

Port 52114  #更改ssh登录端口从22改为52114

PermitRootLogin no  #由yes变成no禁止root远程登录

PubkeyAuthentication yes  #前面的注释去掉开启key登录
AuthorizedKeysFile      .ssh/authorized_keys #指定公钥位置

PermitEmptyPasswords no   #注释去掉禁止空密码登录
PasswordAuthentication no   #禁止密码登录,必然很可能要遭到密码暴力破解

#GSSAPIAuthentication yes  #这两行一开始不是注释的,注释掉不GSS验证

#GSSAPICleanupCredentials yes

到这里,配置文件修改结束

/etc/init.d/sshd restart #重启sshd服务

7.优化第七步:优化用户与登录策略(近接第六步操作)

useradd wroot   #添加代替root登录和操作的普通用户

vi /etc/sudoers  #更改此普通用户的权利(visudo命令也可以)

wroot   ALL=(ALL)       NOPASSWD:ALL  #给wroot用户root所拥有的一切权利

至此用户授权完毕
su – wroot   #切换到wroot用户
ssh-keygen -t rsa  #生成私钥公钥对

[wroot@client ~]$ cd .ssh/

[wroot@client .ssh]$ cat id_rsa.pub >>authorized_keys  #生成公钥

[wroot@client .ssh]$ chmod 644 authorized_keys

[wroot@client .ssh]$ sz id_rsa #将私钥下载下来

下面是一些测试结果,我们再登录192.168.1.201这台机器试一下

yh2.png

我们下来把秘钥key上传到另一台服务器

yh3.png

我在工作中,一般会设置一个普通用户只用来登录,然后再用密码切换到对应的用户。

8.优化第八步:开启防火墙

我在工作中,在调试防火墙的时候会先加定时任务一段时间会关闭防火墙防止自己调试出错,然后防火墙一般是只开启必须的端口,其余端口都是禁止掉的。像ssh这种登录呢,只允许我的跳板机内网过来,其他服务器是不允许ssh过来的,跳板机一般只允许办公网IP登录。比如现在192.168.1.202就是我的跳板机,我们一般都会跳板机主备的,所以应该是允许两个IP能ssh登录。

iptables -F  #清空防火墙规则

iptables -A INPUT -p tcp –dport 52114 -s 192.168.1.202 -j ACCEPT #只允许某个IP能访问52114端口

iptables -A INPUT -p tcp –dport 52114 -j DROP  #其余连接52114端口的全部不予响应

/etc/init.d/iptables save  #保存防火墙规则

/etc/init.d/iptables restart  #重启防火墙

yh4.png

yhh.png

这就是效果,被允许连接的ip可以ssh登录,其余全部不响应请求,这样登录策略进一步安全。

9. 优化第九步:禁止Ctrl+Alt+Delete重启命令

普通用户是不能执行reboot或者halt等命令的,但是它如果是图形界面登录的话,可以执行Ctrl+Alt+Delete重启服务器,这就比较恶心了,要禁止掉,防患于未然。

vi /etc/init/control-alt-delete.conf

#exec /sbin/shutdown -r now “Control-Alt-Delete pressed” #像这样注释掉就可以了

10. 优化第十步:历史命令记录数量调小

历史记录history,是把双刃剑,一方面可以帮我们记录我们曾经做了哪些操作,另一方面也可以让别人知道你做了哪些操作,坑啊。我感觉至少我们的跳板机要将历史命令记录值调的尽量小,因为我们登录集群服务器的其他机器都是通过跳板机内网跳转的,虽然人家可以通过网络命令来查内网中的其他服务器的ip地址,但是历史记录这块可以pass掉了。

sed -i “s/HISTSIZE=1000/HISTSIZE=10/” /etc/profile #将历史记录值由1000变为10
source  /etc/profile  #使生效

[root@client ~]# history |wc -l  #看下效果
10

11. 优化第十一步:修改系统默认字符集

我安装系统的时候默认就是UTF-8字符集,但是以防万一也是要优化一下的。

vi  /etc/sysconfig/i18n

LANG=”zh_CN.UTF-8″   #这里改成你想要的字符集,如果想搞成gbk就这样LANG=”zh_CN.GB18030″

source  /etc/sysconfig/i18n #使生效

12. 优化第十二步:调整文件描述符大小

为什么调整文件描述符大小呢。默认是1024,维护过nginx服务器或者squid服务器的运维朋友都了解,这里必须得调大,不然打开文件的数量太少了,要狂报错的。这里呢因为是统一优化也不知道此服务器将要用于什么用途,可以先调成10240或者35655之类的,不要一下子就调到最大65535。

echo ‘*   –  nofile  10240′ >>/etc/security/limits.conf #添加到文件里面去

ulimit -HSn 10240  #用命令暂时是文件描述符从1024变成10240

由于已经将修改添加到配置文件里面去了,再退出窗口重新登录就能看到变化了,如果没有第一步添加文件的操作,退出窗口重新登录后,文件描述符又会变成1024.

13. 优化第十三步:内核参数优化

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 = 4096    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
net.ipv4.ip_conntrack_max = 25000000
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  #使配置文件生效

#net.ipv4.tcp_fin_timeout = 2 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2的状态时间,单位是秒,这个就是四次断开的最后一下,减少等待时间。

#net.ipv4.tcp_tw_reuse = 1  表示开启重用。允许TIME-WAIT套接字重新用于新的TCP链接。默认是0表示关闭。

#net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中的TIME-WAIT套接字的快速回收,默认是0表示关闭

#net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookie来处理,可防范少量的SYN攻击。默认为0,表示关闭。

#net.ipv4.tcp_keepalive_time =600 表示当keepalive启用时,TCP发送keepalive消息的频率,默认是2小时,这里改为10分钟

#net.ipv4.ip_local_port_range = 4096    65000 #表示向外连接的端口范围,默认很少,32768~65535

#net.ipv4.tcp_max_syn_backlog = 16384 表示SYN队列的长度,默认为1024,加大队列长度为16384,可以容纳更多等待连接的网络连接数。

#net.ipv4.tcp_max_tw_buckets = 36000 示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数 字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为36000。对于Apache、Nginx等服务器,前面介绍的几个参 数已经可以很好地减少TIME_WAIT套接字数量,但是对于Squid来说,效果却不大。有了此参数就可以控制TIME_WAIT套接字的最大数量,避 免Squid服务器被大量的TIME_WAIT套接字拖死。

#net.ipv4.route.gc_timeout = 100 路由缓存刷新频率,当一个路由失败后多长时间跳到另一个默认是300秒

#net.ipv4.tcp_syn_retries = 1  对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右。

#net.ipv4.tcp_synack_retries = 1  对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。

#net.core.somaxconn = 16384 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。对繁忙的服务器,增加该值有助于网络性能。默认是128.

#net.core.netdev_max_backlog = 16384 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,对重负载服务器而言,该值需要调高一点。默认是1024

#net.ipv4.tcp_max_orphans = 16384 系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制。如果内存大更应该增加这个值。默认值是8192.

#一下参数是对iptables防火墙的优化,防火墙不开会有提示,可以忽略不理。
#net.ipv4.ip_conntrack_max = 25000000 系统支持的最大ipv4连接数,默认65536,同时这个值和你的内存大小有关,如果内存128M,这个值最大8192,1G以上内存这个值都是默认65536
#net.nf_conntrack_max = 25000000
#net.netfilter.nf_conntrack_max = 25000000
#net.netfilter.nf_conntrack_tcp_timeout_established = 180 已建立的tcp连接的超时时间,默认432000,也就是5天,这个值过大将导致一些可能已经不用的连接常驻于内存中,占用大量链接资源,从而可能导致NAT ip_conntrack: table full的问题,这里调小了
#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

14. 第十四步优化:修改ip地址,dns,主机名

IP地址我们按要求设置成固定的IP地址

dns我们是内建的dns服务器,因为服务器之间比如说跟mysql通信啊什么的,很多是以域名的形式通信,这样我们就要在/etc/hosts里面制定,如果内建dns呢,只要把服务器的dns改为我们的dns服务器,以后直接内部访问域名就可以了。

vi /etc/resolv.conf  #这个文件修改dns服务器

nameserver 192.168.1.116  #比方说这个内网地址就是我们的dns服务器

当然,你服务器不是集群,就是想单纯的上网的话,就可以

nameserver 202.106.0.20 #就可以设置成你与你网络服务商对应的公网dns服务器就可以了

如果要永久有效:vi /etc/sysconfig/network-scripts/ifcfg-eth0

DNS1=202.106.0.20 #添加这么一条

[root@client ~]# /etc/init.d/network restart  #重启网卡使生效

主机名这个是很关键的,我们要设置成与我们服务相关的主机名,这样不仅登录上来后一眼通过主机名就能了解大概此服务器是负责什么的,另外在我们批量管理,比如说用puppet批量管理的时候,就可以通过主机名进行分类,进行细致化的管理。

vi /etc/sysconfig/network  #这里设置主机名称

HOSTNAME=img.aivideo.com #比方说我们这是图片服务器,就设置以img开头的主机名称

[root@client ~]# hostname  img.aivideo.com

15. 第十五步优化:对关键文件进行加固

下面这步我一般都是环境搭建完毕,如web服务什么的已经在运行基本不会再设计到添加用户什么操作之类的时候,再做。

chattr +i /etc/passwd

chattr +i /etc/inittab

chattr +i /etc/group

chattr +i /etc/shadow

chattr +i /etc/gshadow

16. 第十六步优化:history显示时间

#cat /etc/profile  #加上下面一句话
HISTTIMEFORMAT="%F %T `whoami` "

#source /etc/profile  #生效一下

图片.png

#就可以通过history查看,记录的什么时候做了什么

作者:忙碌的柴少 分类:安全与优化 浏览:2771 评论:0
留言列表
发表评论
来宾的头像