第1章安装linux系统后调优及安全设置

1.1 关闭SELinux功能

[root@moban /]# sed -i 's/SELLINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

==》修改配置文件可使用高配置永久生效,但必须要重启系统,此步时sed快速修改方法,也可以通过vi编辑修改此文件。

[root@moban /]# grep SELINUX=disabled /etc/selinux/config

SELINUX=disabled 《===检查替换结果为disabled就表示编辑成功了。

回到root ==》vi /etc/selinux/config

1.1.1 selinux是什么?

安全工具,控制太严格了,生产环节不用它,使用跟其他的安全手段。

永久关闭(需要重启系统):

vi /etc/selinux/config

SELINUX=enforcing改为SELINUX=disabled

临时关闭

selenlore 0 命令行关闭SELINUX

getenfore 查看命令行是否关闭SELINUX

永久关闭(重启系统):

vi /etc/selinux/config

SELINUX=enforcing改为SELINUX=disabled

sed i 's#>SELINUX=enforcing#SELINUX=disabled#g'

/etc/selinux/config

临时关闭:

setenfore 0 命令行关闭SELINUX

getenfore 查看命令行是否关闭SELINUX


1.1.2 命令说明:

setenfore:用于命令行管理SELinux的级别,后面的数字表示设置对应的级别。

getenforce:查看SELinux当前的级别状态。

  提示:修改配置SELINUX后,要想时期生效,必须要重启系统。因此,可配合使用sctenforce 0这个临时相当于使其关闭的命令,这样在重启前后都可以使得SELinux关闭生效了。也就是说无需立刻重启服务器了,在生产场景下Linux机器是不能随意重启的。

  

1.2 运行级别:

linux运行时的一种状态表示,这个标识用于数字表示7中运行级别。

0 halt,关机状态

1 single user 单用户,找回root密码

2 multiuser without nfs.多用户没有NFS网络文件系统

3 文本模式(Full multiuser mode ) ***** 工作模式

4 unused

5 图形、桌面、X11

6 reboot 重启


1.2.1 如何查看当前系统的运行级别

runlevel

[root@moban /]# runlevel

N(前一次) 3(当前)


1.2.2 更改运行级别

init

例如:init 6 就表示重启




1.3 精简开机系统启动

1.3.1 重要的开机自启动服务

  sshd

  远程连接Linux服务器是需要用到这个服务程序,所以必须要开启,

  否则将无法远程连接Linux服务器。

  rsyslog

  是操作系统提供的一种机制,系统的守护程序通常会使用rsyslog

  将各种信息写到各个日同日志文件中,Centos6以前此服务的名字

  为syslog

  network

  系统启动时,若想激活/关闭各个网络接口,则应(必须)考虑开启。

  crond

  该服务用于周期性地执行系统用户配置的任务计划。有要周期性

  执行的任务时,就要开启,此服务几乎是生产场景必须要用的一

  个软件。

  sysstat

  sysstat是一个软件包,保护检测系统性能及效率的一组工具,

  这些工具对于我们手机系统性能数据很有帮助,比如CPU使用率、

  硬盘和网络吞吐数据等,这些数据的手机和分析,有利于判断系

  统运行是否正常,所以它是提高系统运行效率、安全运行服务器

  的得力助手。

  Sysstat软件包集成的主要工具为:

iostat工具提供CPU使用率及硬盘吞吐效率的数据;

mpstat工具提供与单个或多个处理器相关的数据;

sar工具负责收集、报告并存储系统活跃的信息。


提示:上述5个服务是安装完系统后建议保留的开机启动服务,也几乎是一切服务器必须开机保留的自启动服务。将来还可以根据服务器的业务使用个场景调整相应的自启动服务,所谓调整,就是增加其他自启动服务。


1.3.2 设置开启自启动服务的常见方法

1)执行命令,然后手动选择处理的方法

方法1:执行ntsysv命令然后在弹出的窗口中进行设置。

方法2:执行setup->system service,然后在弹出的窗口中进行设置

提示:初学者可以选择上述两种方法中的一种来完成配置。


为什么要设置开机自启动?

好处:

1、节省开机时间,加快启动速度。

2、节省资源开销

3、减少安全隐患


如何做?

第一种setup

第二种ntsysv

第三种chkconfig



sed 后向引用

sed -r 's#(.*)(.*)#\1 \2#g'


1.4 关闭iptables防火墙

关闭防火墙的目的是为了让初学者更方便,将来在学了iptables技术后可再统一开启。在企业环境中,一般只有外网IP的服务器才需要开启防火墙,但即使是外网IP,对于高并发流量的业务服务器仍是不能开的,因为会有较大性能损失,导致网站访问很慢,这种情况下只能在前段加更好的硬件防火墙了。

关闭防火墙的具体操作过程如下:

[root@moban /]# /etc/init.d/iptables stop

[root@moban /]# /etc/init.d/iptables stop==service iptables stop



1.5 Linux系统安全最小原则说明

最小化原则对linux系统安全来说极其重要:即多一事不如少一事。

具体包括如下几个方面:

1)安装linux系统最小化,即选包最小化,yum安装软件包也要最小化,无用的包不装。

2)开机自启动服务最小化,即无用的服务不开启

3)操作命令最小化。例如:能用“rm -f tets.txt”就不用“rm -fr test.txt”.

4)登陆Linux用户最小化。平时没有特殊需求不登录root,用普通用户登录即可。

5)普通用户授权权限最小化,即只给用户必须的管理系统的命令,不能啥都可以干。


1.6 更改SSH服务端远程登陆的配置

windows服务器的默认远程管理端口是3389,管理员用户是administrator,普通用户是guest。linux的管理用户是root,普通用户默认有很多个,远程连接默认端口port 22

这些通常搞IT人都知道。那么***是否也知道呢?他们当然知道,甚至比我们更清楚,所以,为了

系统安全要隐藏或更改上述默认的配置才行。

[root@moban /]# cp /etc/ssh/sshd_config  /etc/ssh/sshd_config.ori

更改配置前进行备份,是系统管理员的一个良好的习惯。

[root@moban /]# vi /etc/ssh/sshd_config #-》编辑sshd_config

###by moban#2016-03-10##

Prot 52113

PermitrootLogin no

PermitEmptypasswords no

UseDNS no

GSSAPIAuthentication no

### moban#2016-03-10##

执行如下命令重启sshd,是的修改的配置生效:

[root@moban /]# /etc/init.d/sshd reload

重新载入sshd [确定]

或者

/etc/init.d/sshd restart

提示:reload为平滑重启,不影响正在SSH连接的其他用户,因此要好于restart。



1.7 利用sudo控制用户对系统命令的使用权限

为了安全及管理的方便,可将需要root权限的普通用户加入sudo管理,这样用户就可以通过自己的普通账户登录实现利用root的权限来管理系统了,当然也就不需要有root账号及密码了。

执行如下visudo命令,即可打开sudo的配置文件进行编辑。

[root@moban ~]# visudo #相当于直接编辑/etc/sudoers,单用命令方式更安全,推荐

在/etc/sudoers文件的大约第98行下面添加需要提升为root权限的普通用户名及对应权限。

1.7.1 优化注意的几个方面:

安装linux系统最小化,即选包最小化,yum安装软件包也要最小化,无用的包不装。

开机自启动服务最小化,即无用的服务不开启。

操作命令最小化。例如:能用“rm -f test.txt”就不用“rm -fr test.txt”

登录linux用户最小化。平时没有特殊需求不登录root,用普通用户登录即可。

普通用户授权权限最小化,即只给用户必须的管理系统的命令,不能啥都可以干。

linux系统文件及目录的权限设置最小化,禁止随意创建、更改、删除文件


普通用户与皇帝root

普通用户当皇帝的办法有两种:

第一种是 su - root ,执行su - 或su - root相当于农民起义,推翻皇帝,改朝换代了。需要输入root密码才能登陆。

第二种是sudo ,sudo touch /etc/test.txt让普通人做只有皇帝能做的事情,需要皇帝事先授权(sudoers文件)sudo su - root 功高盖主了,也可以改朝换代,最大化授权sudo后果。


sudo设全对于bash的内置命令处理,十个难题,因为内置命令没有实体文件和路径,不过一般都有解决方法例如希望sudo cd 用sudo ls 替代,有的网友使用sudo bash后再使用内置命令,这是很危险的,不推荐。


1.8 linux中文显示设置

此项优化为可选项,即调整linux系统的字符集设置,那么。什么是字符集呢?简单的说,字符集就是一套文字符号及其编码。目前linux下常用的字符集有:

GBK:定长,双字节,不是国际标准,支持的系统不少,实际企业用的不多

UTF-8:费定长,1~4字节,广泛支持,MYSQL也是用UTF-8,企业广泛使用。

可通过快捷的命令方式在/etc/sysconfig/i18n中添加如下内容,使其支持中文显示:

[root@moban ~]# cat /etc/sysconfig/i18n

LANG="en_US.UTF-8"

SYSFONT="latarcyrheb-sun16"

source /etc/sysconfig/i18n启动设置

查看字符集设置的结果。

[root@moban ~]# cat /etc/sysconfig/i18n

LANG="zh_CN.UTF-8"

SYSFONT="latarcyrheb-sun16"

登录linux系统查看中文字符正常显示的步骤如下:

1)将服务器端字符集(/etc/sysconfig/i18n)改为LANG="zh_CN.UTF-8"。

2)将客户端字符集(CRT)调整为UTF-8.

3)命令执行setup命令看到原来中文乱码的窗口不乱了,正确显示中文字符了。


提示:

注意"zh_CN.UTF-8"的大小写字母。

这个中文显示配置要跟你自己的SSH客户端的配置一致。默认情况下就是老男孩演示的配置。

调整SSH客户端CAT的字符集,使其和linux服务端一致(UTF-8)。



1.9 设置linux服务器时间同步

手动同步系统时间

[root@moban ~]# /usr/sbin/ntpdate time.nist.gov

31 Mar 22:35:56 ntpdate[10098]: step time server 24.56.178.140 offset 82739.057723 sec

利用定时任务crond把上述的手动命令没5分钟自动执行一次:

[root@moban ~]# crontab -l

*/5 * * * * /usr/sbin/ntpdate time.nist.gov >dev/null 2>&1


1.10 linux系统变量优化

1.10.1 设置闲置账号超时时间

设置闲置账号超时时间示例命令如下,注意此处的配置仅临时生效。

[root@moban ~]# export TMOUT=10

[root@moban ~]# 

timed out waiting for input: auto-logout #10秒提示超时

1.10.2 设置linux的命令行历史记录数

设置linux的命令行历史记录数命令如下,注意此处的配置仅临时生效。

[root@moban ~]# export HISTSIZE=5

[root@moban ~]# history

  914  date

  915  /usr/sbin/ntpdate time.nist.gov

  916  crontab -l

  917  export HISTSIZE=5

  918  history

1.10.3 设定用户的命令行历史记录文件

设定用户的命令行历史记录文件(~/.bash_history)记录指定命令如下,注意此处的配置仅临时生效。

[root@moban ~]# export HISTFILESIZE=5

[root@moban ~]# cat ~/.bash_history

/usr/sbin/ntpdate time.nist.gov

crontab -l

export HISTSIZE=5

history

export TMOUT=10

[root@moban ~]#

把上述命令放入配置文件,使其可以永久生效。

配置文件:/etc/profile

source /etc/profile #使得配置文件生效

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

export TMOUT=10 :连接的超时时间控制变量

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

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

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



1.11 调整linux系统文件描述符数量

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

对于内核而言,所有打开的文件都是通过文件描述符引用的。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件是,使用open或creat返回的文件描述符标识改文件,并将其作为参数传递给read或write。

[root@moban ~]# ulimit -n

1024 文字描述符数量

对于高并发的业务linux服务器来说,这个默认的设备值是不够的,需要调整。

1.11.1 调整方法1:

执行vim /etc/security/limits.conf命令,在文件结尾加上如下一行。

* - nofile 65535

或者直接执行命令追加到文件尾部/etc/security/limits.conf

配置完成后,需重新登陆才可以生效,用ulimit -n 命令查看。

1.11.2 调整方法2

直接把ulimit-SHn65535命令加入到/etc/rc.local,然后每次开机启动的时候生效。


[root@moban ~]# cat >>/etc/rc.local<


1.12 linux服务器内核参数优化

所谓linux服务器内核参数优化,主要是指在linux系统中针对业务服务应用而进行的系统内核参数调整,优化并无一定的标准,下面生产环境下linux常见的内核优化为例进行讲解,仅供大家参考。

优化方法是,执行vi /etc/sysctl.conf命令道文件结尾,然后拷贝如下内容并保存。

sysctl -p 是的加载的参数生效 

网络状态说明及优化命令和优化细节参考资料请看:

http://oldboy.blog.51cto.com/2561410/1336488

http://yangrong.blog.51cto.com/6945369/1321594


1.13 定时清理邮件服务临时目录垃圾文件

centos5系列的系统会默认安装sendmail服务,因此邮件临时存放地点的路径为/var/spool/clientmqueue/。

centos6默认情况下没有安装sendmail服务,而是改装了postfix服务,因此邮件临时存放点的路径为/var/spool/postfix/maildrop

以上两个目录很容易被垃圾文件填满导致系统的inode数量不够用,从而导致无法存放文件。

手动清理的方法如下:

[root@moban ~]# find /var/spool/clientmqueue/ -type f |xargs rm -f #centos5


[root@moban ~]# find /var/spool/postfix/maildrop/ -type f |xargs rm -f #centos6

定期清理的方法为:将上述命令携程脚本,然后做成定时任务,每天晚上0点执行一次。

[root@moban ~]#echo "find /var/spool/postfix/maildrop/ -type f|xargs rm -f">/server/scripts/del_file.sh

[root@moban ~]# crontab -e

00 00 * * * /bin/sh /server/scripts/del_file.sh >dev/null 2>&1


1.14 隐藏linux版本信息显示

在登录到linux主机本地(非CRT连接)前,会显示系统的版本和内核

[root@moban ~]# cat /etc/issue

CentOS release 6.7 (Final)

Kernel \r on an \m


[root@moban ~]# cat /etc/issue.net

CentOS release 6.7 (Final)

Kernel \r on an \m

[root@moban ~]#


执行如下命令清除linux系统版本及内核信息

[root@moban ~]# > /etc/issue

[root@moban ~]# > /etc/issue.net


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

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

[root@moban ~]# chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab

提示:上锁后,所用该用户都不能对文件修改删除

解锁的命令如下

[root@moban ~]# chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab

提示:上锁后,如需临时错做,可以解锁后对文件进行修改,之后再上锁。



1.16 清除多余的系统虚拟账号

操作前要先根据公司系统提供的服务确定哪些账号不需要使用,如果不确定就不要操作了,一般情况下,一个规范的系统提供的服务都比较少,因此,系统中默认的绝大多数虚拟用户都是可以删除的。例如: bin/adm/lp/halt/mail/uncp/operator/games/gopher/ftp/dbus/vcsa/abrt/ntp/saslauth/postfix/tcpdump等,这些用户本身也是无法登陆的,因此,此项优化不是必须的。



1.17 为grub菜单加密码

为grub菜单加密码的目的是防止他人修改grub做内核等启动设置,以及用单用户模式启动破解root密码等操作。实际上此步可以在安装系统的过程中设定,安装系统后的具体设定步骤如下:

1)先用/sbin/grub-md5-crypt产生一个MD5密码串,如下

[root@moban ~]# /sbin/grub-md5-crypt

Password: 

Retype password: 

$1$vS9Bj$UKnQYq/V4Z2HIds8FVPJL.

2)修改grub.conf文件,命令如下:

[root@moban ~]# vi /etc/grub.conf


      1 # grub.conf generated by anaconda

      2 #

      3 # Note that you do not have to rerun grub after making changes to this file

      4 # NOTICE:  You have a /boot partition.  This means that

      5 #          all kernel and initrd paths are relative to /boot/, eg.

      6 #          root (hd0,0)

      7 #          kernel /vmlinuz-version ro root=/dev/sda3

     12 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

      1 # grub.conf generated by anaconda

      2 #

      3 # Note that you do not have to rerun grub after making changes to this file

      4 # NOTICE:  You have a /boot partition.  This means that

      5 #          all kernel and initrd paths are relative to /boot/, eg.

      6 #          root (hd0,0)

      7 #          kernel /vmlinuz-version ro root=/dev/sda3

      8 #          initrd /initrd-[generic-]version.img

     13 hiddenmenu

     14 password --md5 $1$vS9Bj$UKnQYq/V4Z2HIds8FVPJL

#注意:password 要加载splashp_w_picpath和title之间这段,否则可能不生效

     15 title CentOS 6 (2.6.32-573.el6.x86_64)

     16         root (hd0,0)

     17         kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=c511f78f-2713-4ca

        d-8dcc-756dab643fc1 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=l

        atarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb

         quiet

     18         initrd /initramfs-2.6.32-573.el6.x86_64.img

设置完成后,下次开机需要管理grub时就会提示输入密码。



1.18 禁止linux系统被ping

此项优化不是必须的,而且又是我们自己也会通过ping来检查服务器是否异常,对于要求很高的中小企业服务器,设置禁止ping也是可以的。从安全角度来说,禁止ping还是会增加系统安全的。禁止png的命令如下:

[root@moban ~]# echo "net.ipv4.icmp_echo_ignore_all=1">> /etc/sysctl.con

[root@moban ~]#tail -1 /etc/sysctl.conf

net.ipv4.icmp_echo_ignore_all=1

[root@moban ~]#sysctl -p #启动

其实这个禁ping的方法还不是好的额策略,因为禁止ping后,我们自己也无法通过ping检查了,比较好的策略是通过iptables设置让特定的IP可以ping,例如:让内网用户ping其他外部用户不能ping。例如:在默认策略为drop的情况下,可以执行如下命令,

为10.0.0.0/24网段允许ping

iptables -t filter -I INPUT -p icmp --icmp -type 8 -i eth0 -s 10.0.0.0/24 -j ACCEPT


工作中防火墙处理

还原禁ping

删除/etc/sysctl.conf中的net.ipv4.icmp_echo_ignore_all=1

并执行如下命令

etho 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all



1.19 升级具有典型漏洞的软件版本

openssl openssh bash爆出很多软件漏洞,在企业场景需要进行修复漏洞操作,步骤如下:

1)首先检查相关软件的版本号

[root@moban ~]# rpm -qa openssl openssh bash

bash-4.1.2-33.el6.x86_64

openssh-5.3p1-111.el6.x86_64

openssl-1.0.1e-42.el6.x86_64

2)执行升级已知漏洞的软件版本到最新,命令如下

[root@moban ~]# yum install openssl openssh bash -y



1.20 linux基础优化与安全重点小结

1)不用root登录管理系统,而以普通用户登录通过sudo授权管理

2)更改默认的远程连接SSH服务端口,禁止root用户远程连接,甚至更改SSH服务只监听内网IP。

3)定时自动更新服务器的时间,使其和互联网时间同步。

4)配置yum更新源,从国内看更新源下载安装软件包

5)管理SELinux及iptables(在工作场景中,如果有外部IP一般要打开iptables,高并发高流量的服务器可能无法开启)。

6)调整文件描述符的数量,进程及文件的打开都会消耗文件描述符数量。

7)定时自动清理邮件临时目录垃圾文件,防止磁盘的inodes数被小文件占满(注意cetos6和centos5要清除的目录不同)

8)精简并保留必要的开机自启动服务(如crond、sshd、network、rsyslog、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改名为olboy,转移走,这样就安全多了。

12)清空/etc/issue、/etc/issue.net,去除系统及内核版本登录前的屏幕显示。

13)清除多余的系统虚拟用户账号。

14)为grub引导菜单加密码


提示:上述仅为安装linux后的一些基础优化,更多针对不同业务服务器的优化思路见:

http://oldboy.blog.51cto.com/2561410/1336488

http://yangrong.blog.51cto.com/6945369/1321594