- 前言
- 为什么要写这本书
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第一部分 安全运维篇
- 第 1 章 Linux 服务器安全运维
- 第 2 章 Linux 网络安全运维
- 第 3 章 数据安全工具 DRBD、extundelete
- 第二部分 运维故障排查篇
- 第 4 章 Linux 系统运维故障排查思路
- 第 5 章 Linux 故障排查案例实战
- 第三部分 自动化运维篇
- 第 6 章 轻量级运维利器 pssh、pdsh 和 mussh
- 第 7 章 分布式监控系统 Ganglia
- 第 8 章 基于 nagios 的分布式监控报警平台 Centreon
- 第 9 章 通过 Ganglia 与 Centreon 构建智能化监控报警平台
- 第四部分 集群架构篇
- 第 10 章 高性能 Web 服务器 Nginx
- 第 11 章 高性能集群软件 Keepalived
- 第 12 章 千万级高并发负载均衡软件 HAProxy
- 第 13 章 构建高性能的 MySQL 集群系统
- 第 14 章 高性能负载均衡集群软件 HAProxy
1.1 账户和登录安全
安全是 IT 行业一个老生常谈的话题了,最近的“棱镜门”事件折射出了很多安全问题,处理好信息安全问题已变得刻不容缓。因此作为一名运维人员,必须了解一些安全运维准则,同时,要保护自己所负责的业务,首先要站在攻击者的角度思考问题,才能修补任何潜在的威胁和漏洞。
账户安全是系统安全的第一道屏障,也是系统安全的核心,保障登录账户的安全,在一定程度上可以提高服务器的安全级别,本节重点介绍 Linux 系统登录账户的安全设置方法。
1.1.1 删除特殊的用户和用户组
Linux 提供了各种不同角色的系统账号,在系统安装完成后,默认会安装很多不必要的用户和用户组,如果不需要某些用户或者用户组,应立即删除它们,因为账户越多,系统就越不安全,从而很可能被黑客利用,威胁服务器的安全。
Linux 系统中可以删除的默认用户和用户组大致如下:
- - 可删除的用户,如 adm、lp、sync、shutdown、halt、news、uucp、operator、games、gopher 等。
- - 可删除的用户组,如 adm、lp、news、uucp、games、dip、pppusers、popusers、slipusers 等。
删除的方法很简单,下面以删除 games 用户和用户组为例介绍具体的操作。
删除系统不必要的用户使用下面命令:
[root@localhost ~]# userdel games
删除系统不必要的用户组使用如下命令:
[root@localhost ~]# groupdel games
有些时候,某些用户仅仅用作进程调用或者用户组调用,并不需要登录功能,此时可以禁止这些用户登录系统的功能,例如要禁止 nagios 用户的登录功能,可以执行如下命令:
[root@localhost ~]# usermod -s /sbin/nologin nagios
其实要删除哪些用户和用户组,并没有固定要求,可以根据服务器的用途来决定,如果服务器是用于 Web 应用的,那么系统默认的 apache 用户和用户组就无需删除;而如果服务器是用于数据库应用的,那么建议删除系统默认的 apache 用户和用户组。
1.1.2 关闭系统不需要的服务
在安装完成后,Linux 绑定了很多没用的服务,这些服务默认都是自动启动的。对于服务器来说,运行的服务越多,系统就越不安全,运行的服务越少,系统安全性就越高,因此关闭一些不需要的服务,对系统安全有很大的帮助。
具体关闭哪些服务,要根据服务器的用途而定,一般情况下,只要系统本身用不到的服务都认为是不必要的服务,例如某台 Linux 服务器用于 WWW 应用,那么除了 httpd 服务和系统运行是必需的服务外,其他服务都可以关闭。下面这些服务一般情况下是不需要的,可以选择关闭:
anacron、auditd、autofs、avahi-daemon、avahi-dnsconfd、bluetooth、cpuspeed、firstboot、gpm、haldaemon、hidd、ip6tables、ipsec、isdn、lpd、mcstrans、messagebus、netfs、nfs、nfslock、nscd、pcscd portmap、readahead_early、restorecond、rpcgssd、rpcidmapd、rstatd、sendmail、setroubleshoot、yppasswdd ypserv
关闭服务自动启动的方法很简单,可以通过 chkconfig 命令实现。例如,要关闭 bluetooth 服务,执行下面命令即可:
chkconfig --level 345 bluetooth off
对所有需要关闭的服务都执行上面的操作后,重启服务器即可。
为了系统能够正常稳定运行,建议启动的系统运行必需的服务如表 1-1 所示。
表 1-1 系统运行必需的服务
1.1.3 密码安全策略
在 Linux 下,远程登录系统有两种认证方式:密码认证和密钥认证。密码认证方式是传统的安全策略,对于密码的设置,比较普遍的说法是:至少 6 个字符以上,密码要包含数字、字母、下划线、特殊符号等。设置一个相对复杂的密码,对系统安全能起到一定的防护作用,但是也面临一些其他问题,例如密码暴力破解、密码泄露、密码丢失等,同时过于复杂的密码也会对运维工作造成一定的负担。
密钥认证是一种新型的认证方式,公用密钥存储在远程服务器上,专用密钥保存在本地,当需要登录系统时,通过本地专用密钥和远程服务器的公用密钥进行配对认证,如果认证成功,就可以成功登录系统。这种认证方式避免了被暴力破解的危险,同时只要保存在本地的专用密钥不被黑客盗用,攻击者一般无法通过密钥认证的方式进入系统。因此,在 Linux 下推荐用密钥认证方式登录系统,这样就可以抛弃密码认证登录系统的弊端。
Linux 服务器一般通过 SecureCRT、putty、Xshell 之类的工具进行远程维护和管理,密钥认证方式的实现就是借助于 SecureCRT 软件和 Linux 系统中的 SSH 服务实现的。
SSH 的英文全称是 Secure SHell。SSH 以及 OpenSSH 是类似于 telnet 的远程登录程序,SecureCRT 就是一个 SSH 客户端,要想通过 SecureCRT 登录远程机器,要求该远程机器必须运行 sshd 服务。但是,与 telnet 不同的是,SSH 协议非常安全,数据流加密传输,确保数据流的完整性和安全性。OpenSSH 的 RSA/DSA 密钥认证系统是一个优秀的功能组件,使用基于密钥认证系统的优点在于:在许多情况下,可以不必手工输入密码就能建立起安全的连接。
支持 RSA/DSA 密钥认证的软件有很多,这里以 SecureCRT 为例,详细讲述通过密钥认证方式远程登录 Linux 服务器的实现方法。
这里的环境是 SecureCRT5.1、CentOS6.4、SSH-2.0-OpenSSH_5.3,操作如下。
1)首先产生 SSH2 的密钥对,这里选择使用 RSA 1024 位加密,如图 1-1 所示。
图 1-1 创建公钥
2)弹出“密钥生成向导”对话框,如图 1-2 所示。
图 1-2 密钥生成向导
3)在选择密钥类型时,选择 RSA 方式,如图 1-3 所示。
图 1-3 选择密钥类型
4)输入一个保护设定的加密密钥的通行短语,如图 1-4 所示。
图 1-4 设定加密密钥通行短语
5)在密钥的长度(位)中,使用默认的 1024 位加密即可,如图 1-5 所示。
图 1-5 设置密钥长度
6)系统开始生成密钥,如图 1-6 所示。
图 1-6 生成密钥
7)为生成的密钥选择一个文件名和存放的目录(可以自行修改或使用默认值),如图 1-7 所示。
图 1-7 保存密钥文件
到这里为止,使用客户端 SecureCRT 生成密钥的步骤已经完成。接下来将密钥文件上传到 Linux 服务器端,并在服务器端导入密钥。
例如,这里设置普通用户 ixdba 使用 SSH2 协议,在 Linux 服务器执行如下操作:
[ixdba@localhost~]$ mkdir /home/ixdba/.ssh [ixdba@localhost~]$ chmod 700 /home/ixdba/.ssh
把之前生成的后缀名为 pub 的密钥文件上传到 Linux 服务器上,如果已经在用 SecureCRT 连接 Linux 系统,可以直接使用 rz 命令将密钥文件上传到服务器上,然后开始导入:
[ixdba@localhost~]$ ssh-keygen -i -f Identity.pub >> /root/.ssh/authorized_keys2
完成后,在/home/ixdba/.ssh 下面就会多出一个 authorized_keys2 文件,这就是服务器端的密钥文件。
8)在 SecureCRT 客户端软件上新建一个 SSH2 连接。
在“协议”下拉列表中选择“SSH2”,在主机名文本框中输入“192.168.12.188”,在用户名文本框中输入“ixdba”,其他保持默认,如图 1-8 所示。
9)由于这里要让服务器使用 RSA 方式来验证用户登录 SSH,因此在“鉴权”一栏中只需选择“公钥”方式,然后单击右边的“属性”按钮,如图 1-9 所示。
图 1-8 新建一个 SSH2 连接
图 1-9 指定身份验证方式
10)在出现的“公钥属性”窗口中选择“使用身份或证书文件”,然后找到上面步骤 7 中生成的密钥文件,如图 1-10 所示。
图 1-10 指定身份或证书文件
11)到此为止,通过 RSA 密钥方式验证用户登录 SSH 的步骤就全部完成了。接下来,为了服务器的安全,还需要修改 SSH2 的配置文件,让其只能接收 PublicKey 认证方式来验证用户。
在 Linux 服务器上的操作步骤如下:
[root@localhost ~]# vi /etc/ssh/sshd_config
修改如下几个配置:
Protocol 2 # 仅允许使用 SSH2 PubkeyAuthentication yes # 启用 PublicKey 认证 AuthorizedKeysFile .ssh/authorized_keys2 # PublicKey 文件路径 PasswordAuthentication no # 不使用口令认证
最后重启 sshd 服务,执行如下命令:
[root@localhost ~]# /etc/rc.d/init.d/sshd restart
等 sshd 服务启动完毕,就可以利用 SecureCRT 通过 PublicKey 认证远程登录 Linux 系统了。
1.1.4 合理使用 su、sudo 命令
su 命令是一个切换用户的工具,经常用于将普通用户切换到超级用户下,当然也可以从超级用户切换到普通用户。为了保证服务器的安全,几乎所有服务器都禁止了超级用户直接登录系统,而是通过普通用户登录系统,然后再通过 su 命令切换到超级用户下,执行一些需要超级权限的工作。通过 su 命令能够为系统管理带来一定的方便,但是也存在不安全的因素,例如系统有 10 个普通用户,每个用户都需要执行一些有超级权限的操作,就必须把超级用户的密码交给这 10 个普通用户,如果这 10 个用户都有超级权限,通过超级权限可以做任何事,那么在一定程度上会对系统的安全造成威胁。因此在很多人都需要参与的系统管理中,使用 su 命令并不是最好的选择,超级用户密码应该掌握在少数人手中,此时 sudo 命令就派上用场了。
sudo 命令允许系统管理员分配给普通用户一些合理的“权力”,并且不需要普通用户知道超级用户密码,就能让他们执行一些只有超级用户或其他特许用户才能完成的任务,比如系统服务重启、编辑系统配置文件等,通过这种方式不但能减少超级用户登录次数和管理时间,而且提高了系统安全性。因此,sudo 命令相对于权限无限制性的 su 命令来说,还是比较安全的,这使得 sudo 也被称为受限制的 su,另外 sudo 也是需要事先进行授权认证的,所以也被称为授权认证的 su。
sudo 执行命令的流程是:将当前用户切换到超级用户下,或切换到指定的用户下,然后以超级用户或其指定切换到的用户身份执行命令,执行完成后,直接退回到当前用户,而这一切的完成要通过 sudo 的配置文件/etc/sudoers 来进行授权。
例如,普通用户是无法访问/etc/shadow 文件的:
[user01@unknown ~]$ more /etc/shadow /etc/shadow: Permission denied
如果要让普通用户 user01 可访问这个文件,可以在/etc/sudoers 添加如下内容:
user01 ALL = /bin/more /etc/shadow
这样,通过如下方式 user01 用户就可访问/etc/shadow 文件:
[user01@unknown ~]$ sudo more /etc/shadow [sudo] password for user01:
执行这个命令后,需要输入 user01 用户的密码,然后就可访问文件内容了。在这里 sudo 使用时间戳文件来完成类似“检票”的系统功能,当用户输入密码后就获得了一张默认存活期为 5 分钟的“入场券”(默认值可以在编译的时候改变)。超时以后,用户必须重新输入密码才能查看文件内容。
如果每次都需要输入密码,那么某些自动调用超级权限的程序就会出现问题,此时可以通过下面的设置让普通用户无需输入密码即可执行具有超级权限的程序。例如,要让普通用户 centreon 具有/etc/init.d/nagios 脚本重启的权限,可以在/etc/sudoers 添加如下设置:
CENTREON ALL = NOPASSWD: /etc/init.d/nagios restart
这样,普通用户 centreon 就可以执行重启 nagios 脚本而无需输入密码了。如果要让一个普通用户 user02 具有超级用户的所有权限,而又不想输入超级用户的密码,只需在/etc/sudoers 添加如下内容即可:
user02 ALL=(ALL) NOPASSWD: ALL
这样 user02 用户登录系统后,就可以通过执行如下命令切换到超级用户:
[user02@unknown ~]$ sudo su - [root@unknown ~]# pwd /root
设计 sudo 的宗旨是:赋予用户尽可能少的权限但仍允许他们完成自己的工作,这种设计兼顾了安全性和易用性,因此,强烈推荐通过 sudo 来管理系统账号的安全,只允许普通用户登录系统,如果这些用户需要特殊的权限,就通过配置/etc/sudoers 来完成,这也是多用户系统下账号安全管理的基本方式。
1.1.5 删减系统登录欢迎信息
虽然系统的一些欢迎信息或版本信息能给系统管理者带来一定的方便,但是这些信息有时候可能被黑客利用,从而成为攻击服务器的帮凶,为了保证系统的安全,可以修改或删除某些系统文件,这样的文件有 4 个,分别是/etc/issue、/etc/issue.net、/etc/redhat-release 和/etc/motd。
/etc/issue 和/etc/issue.net 文件都记录了操作系统的名称和版本号,当用户通过本地终端或本地虚拟控制台等登录系统时,就会显示/etc/issue 的文件内容,当用户通过 ssh 或 telnet 等远程登录系统时,在登录后就会显示/etc/issue.net 的文件内容。在默认情况下/etc/issue.net 文件的内容是不会在 ssh 登录后显示的,要显示这个信息可以修改/etc/ssh/sshd_config 文件,在此文件中添加如下内容即可:
Banner /etc/issue.net
其实,这些登录提示很明显泄露了系统信息,为了安全起见,建议将此文件中的内容删除或修改。
/etc/redhat-release 文件也记录了操作系统的名称和版本号,为了安全起见,可以将此文件中的内容删除。
/etc/motd 文件是系统的公告信息。每次用户登录后,/etc/motd 文件的内容就会显示在用户的终端。通过这个文件系统,管理员可以发布一些软件或硬件的升级、系统维护等通告信息,但是此文件的最大作用就是可以发布一些警告信息,在黑客登录系统后,会对其发出这些警告信息,进而产生一些震慑作用。笔者曾看过国外的一个报道,黑客入侵了一台服务器,而这台服务器却给出了欢迎登录的信息,因此法院不做任何裁决。
1.1.6 禁止 Control-Alt-Delete 键盘关闭命令
在 Linux 的默认设置下,同时按下 Control-Alt-Delete 组合键,系统将自动重启,这个策略是很不安全的,因此要禁止 Control-Alt-Delete 组合键重启系统。禁止的方法很简单,在 CentOS5.x 以下的系统,只需修改/etc/inittab 文件即可,操作如下:
[root@localhost ~]# vi /etc/inittab
找到如下这行:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
在这行之前加上“#”,然后执行:
[root@localhost ~]# telinit q
在 CentOS6.x 以上版本中,需要修改/etc/init/control-alt-delete.conf 文件,找到如下内容:
exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
在这行之前加上“#”进行注释掉即可。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论