1. 创建普通用户

在Linux系统运维工作中应遵循一种权限最小化原则,即尽量以普通用户而不是root用户身份进行操作。当不得不使用超级用户权限执行某些命令时,应当通过sudo的形式授权普通用户操作。

此时就会产生一个问题,即当需要在系统中批量创建若干普通用户的时候,如果采用常规的交互方式设置用户初始密码,将会导致大量的手工操作。有一个解决办法是利用passwd命令的--stdin参数结合管道在一条命令中为用户设定明文密码,这样就可以用脚本为多个用户批量创建账号和设置密码的操作。但是这种操作会有安全隐患,因为所执行的命令会被记录在history当中,其他人也可以看到。如果又不希望禁用history,可以用history的-d参数删除设定密码的那一行记录。下面以创建单个用户为例来说明这个流程:

[root@Howden ~]# useradd tynecastle && echo 1234567 | passwd --stdin tynecastle
Changing password for user tynecastle.
passwd: all authentication tokens updated successfully.
[root@Howden ~]# history 5
  295  date
  296  ll /home
  297  tail /etc/passwd
  298  useradd tynecastle && echo 1234567 | passwd --stdin tynecastle
  299  history 5
[root@Howden ~]# history -d $(history | grep 'passwd --stdin tynecastle' | grep -v grep | awk '{print $1}')
[root@Howden ~]# history 5
  296  ll /home
  297  tail /etc/passwd
  298  history 5
  299  history -d $(history | grep 'passwd --stdin tynecastle' | grep -v grep | awk '{print $1}')
  300  history 5


2. 关闭SELinux

百度百科:SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制(MAC: Mandatory Access Controls)的实现,是 Linux历史上最杰出的新安全子系统。

先查看SELinux的配置文件内容:

[root@Howden ~]# cat /etc/selinux/config

# 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=enforcing
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

可以看到默认配置是开启的,要将它关闭需要把enforcing改成disabled:

[root@Howden ~]# sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config

但是这个改动只有在重启了操作系统之后才会生效,可以用getenforce命令看到当前的运行状态还是enforcing:

[root@Howden ~]# getenforce 
Enforcing

如果操作的是线上服务器,不能随便重启,可以用如下命令把SELinux的当前状态改成permissive,这样就只会有警告,不会阻止用户的行为:

[root@Howden ~]# setenforce 0
[root@Howden ~]# getenforce  
Permissive


3. 系统运行级别

如果没有在图形界面下操作的需求,应当保持系统的默认运行级别为3,即多用户文本界面模式:

[root@Howden ~]# cat /etc/inittab 
# 省略部分注释
# 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:

还可以用runlevel命令查看当前的运行级别:

[root@Howden ~]# runlevel
N 3


4. 使用国内的yum源

先备份默认的配置文件:

[root@Howden yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.ori

然后下载阿里云的配置文件:

[root@Howden yum.repos.d]# wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

最后更新缓存:

[root@Howden yum.repos.d]# yum clean all && yum makecache


5. 安装必要的工具软件

如果安装系统时选择的是最小化安装,那么还需要安装一些必要的工具软件:

[root@Howden ~]# yum install tree telnet dos2unix sysstat lrzsz -y


6. 检查已安装的软件包组

我的系统安装了如下软件包组,其中包括在最初安装系统时手动选择的和系统默认安装的:

[root@Howden ~]# yum grouplist
Loaded plugins: fastestmirror, security
Setting up Group Process
Loading mirror speeds from cached hostfile
Installed Groups:
   Base
   Compatibility libraries
   Debugging Tools
   Development tools
   Dial-up Networking Support
   E-mail server
   Fonts
   General Purpose Desktop
   Graphical Administration Tools
   Hardware monitoring utilities
   Input Methods
   Internet Applications
   Internet Browser
   Legacy UNIX compatibility
   Legacy X Window System compatibility
   NFS file server
   Network file system client
   Networking Tools
   Office Suite and Productivity
   Performance Tools
   Perl Support
   SNMP Support
   Scientific support
   Security Tools
   System administration tools

如果还需要手动安装某些软件包组,可以用yum groupinstall命令进行批量安装:

[root@Howden ~]# yum groupinstall "Compatibility libraries" "Dial-up Networking Support"


7. 禁用不必要的开机自启动服务

和Windows一样,Linux也有很多默认开机启动的系统服务,其中有很多不必要的。这样的服务开启得越多,给系统带来的安全隐患就越多。关于CentOS 6.x都有哪些系统服务,可以参考这个地址:http://www.ha97.com/4815.html

查看本机开启了哪些系统服务的方法主要有三种。第一种是在命令行使用setup命令,会出现如下界面:

CentOS 6.5 64位系统的基础优化方法_ 系统服务

选择第四行的System services就可以进入系统服务的列表,并且可以开启或关闭每个服务,如下图:

CentOS 6.5 64位系统的基础优化方法_ yum源_02

第二种方法是在命令行使用ntsysv命令直接调出上面第二图的界面。

第三种方法是使用chkconfig --list查看所有服务在每个运行级别下的开启/关闭状态。假设现在只需启动crond, network, rsyslog, sshd这四个服务,将其他服务全部关闭,可用如下两条组合命令来完成:

[root@Howden ~]# for srv in `chkconfig --list | grep 3:on | awk '{print $1}'`; do chkconfig --level 3 $srv off; done
[root@Howden ~]# for srv in crond network rsyslog sshd; do chkconfig --level 3 $srv on; done

或者更简单地,使用排除法关闭除这四个服务以外的所有服务,可以只用如下一条命令:

[root@Howden ~]# for srv in $(chkconfig --list | grep 3:on | awk '{print $1}' | egrep -v 'crond|network|rsyslog|sshd'); do chkconfig [--level 3] $srv off; done


8. 修改SSH默认配置

优化SSH配置、严格限制非正常登录是提高系统安全性的一个简单有效的方法,具体如下(端口号可以是大于1024的任意端口):

[root@Howden ~]# cat optimise_ssh.sh 
#!/bin/bash

\cp -p /etc/ssh/sshd_config /root/sshd_config.`date +"%F"-$RANDOM`
sed -i 's%#Port 22%Port 30022%' /etc/ssh/sshd_config
sed -i 's%#PermitRootLogin yes%PermitRootLogin no%' /etc/ssh/sshd_config
sed -i 's%#PermitEmptyPasswords no%PermitEmptyPasswords no%' /etc/ssh/sshd_config
sed -i 's%GSSAPIAuthentication yes%GSSAPIAuthentication no%' /etc/ssh/sshd_config
sed -i 's%#UseDNS yes%UseDNS no%' /etc/ssh/sshd_config
egrep 'Port|RootLogin|EmptyPass|GSSAPIAuthentication|UseDNS' /etc/ssh/sshd_config | grep -v ^#
[root@Howden ~]# ./optimise_ssh.sh
Port 30022
PermitRootLogin no
PermitEmptyPasswords no
GSSAPIAuthentication no
UseDNS no
[root@Howden ~]# /etc/init.d/sshd reload
Reloading sshd:                                            [  OK  ]


9. 调整文件描述符的数量限制

通过执行命令ulimit -n可以看到,Linux系统默认的单个进程可打开的文件描述符数量的上限为1024,而在高负载、大并发等应用场景中,这一限制往往远不能满足需求。调整这个上限的方法主要有两种,一种是执行ulimit -SHn:

[root@Howden ~]# ulimit -n
1024
[root@Howden ~]# ulimit -SHn 65535
[root@Howden ~]# ulimit -n
65535

但是这样只能影响到当前的session,当终端重新连接或当前用户退出后就会失效。如果想要永久变更就要用另一种方法,即在配置文件中修改:

[root@Howden ~]# echo -e "*\t-\tnofile\t65535" >> /etc/security/limits.conf
[root@Howden ~]# tail -13 /etc/security/limits.conf 
#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

# End of file
*	-	nofile	65535


10. 内核参数调优

将以下配置添加到内核参数配置文件/etc/sysctl.conf的尾部:

# TCP connections related configurations
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 related configurations
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使上述添加的配置生效。


11. 锁定关键系统文件

出于系统安全考虑,为了极大限度地防止黑客入侵,可以使用chattr +i命令将与用户登录相关的几个关键系统文件加以锁定,禁止对这些文件进行任何修改、更名和删除操作(包括以root身份),从而防止黑客创建用户、篡改root用户和其他正常用户的登录信息:

[root@Howden ~]# chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
[root@Howden ~]# lsattr /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab 
----i--------e- /etc/passwd
----i--------e- /etc/shadow
----i--------e- /etc/group
----i--------e- /etc/gshadow
----i--------e- /etc/inittab

但是如果黑客通过非ssh途径登入系统并获得root权限,仍然可以通过以下命令解锁这些文件:

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

为了防止chattr命令被黑客使用,可以将其改名,让除了管理员以外的其他任何人找不到该命令:

[root@Howden ~]# mv /usr/bin/chattr /usr/bin/test

这样就极大地增加了黑客入侵的难度。


12. 隐藏系统版本

Linux系统在字符界面的用户登录屏幕会默认显示当前系统的发行版本和内核版本,如下图所示:

CentOS 6.5 64位系统的基础优化方法_ 系统服务_03

这也是一种容易被黑客利用的重要的系统信息。黑客可以调查该系统版本存在哪些已知的漏洞,从而找到入侵的突破口。如果不希望在登录屏幕显示系统版本,可以将/etc/issue文件的内容清空,即:

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


13. 将系统编码改为中文

这个只是为了便于显示中文,但经常会导致出现乱码的问题,所以不太建议修改。这里只介绍修改方法:

[root@Almondvale ~]# sed -i 's#LANG="en_US.UTF-8"#LANG="zh_CN.GB18030"#' /etc/sysconfig/i18n
[root@Almondvale ~]# source /etc/sysconfig/i18n