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命令,会出现如下界面:
选择第四行的System services就可以进入系统服务的列表,并且可以开启或关闭每个服务,如下图:
第二种方法是在命令行使用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系统在字符界面的用户登录屏幕会默认显示当前系统的发行版本和内核版本,如下图所示:
这也是一种容易被黑客利用的重要的系统信息。黑客可以调查该系统版本存在哪些已知的漏洞,从而找到入侵的突破口。如果不希望在登录屏幕显示系统版本,可以将/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