《高性能Linux服务器构建实战:系统安全、故障排查、自动化运维与集群架构》——第1章 Linux服务器安全运维 1.1 账户和登录安全

简介:

本节书摘来自华章计算机《高性能Linux服务器构建实战:系统安全、故障排查、自动化运维与集群架构》一书中的第1章,第1.1节,作者:高俊峰著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

第1章 Linux服务器安全运维

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所示。
image
image

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所示。

image

2)弹出“密钥生成向导”对话框,如图1-2所示。
image

3)在选择密钥类型时,选择 RSA 方式,如图1-3所示。

image

4)输入一个保护设定的加密密钥的通行短语,如图1-4所示。
image

5)在密钥的长度(位)中,使用默认的1024位加密即可,如图1-5所示。

image

6)系统开始生成密钥,如图1-6所示。

image

7)为生成的密钥选择一个文件名和存放的目录(可以自行修改或使用默认值),如图1-7所示。

image

到这里为止,使用客户端 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所示。
image

10)在出现的“公钥属性”窗口中选择“使用身份或证书文件”,然后找到上面步骤7中生成的密钥文件,如图1-10所示。

image

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"

在这行之前加上“#”进行注释掉即可。

相关文章
|
29天前
|
存储 负载均衡 索引
linux7安装elasticsearch-7.4.0集群配置
linux7安装elasticsearch-7.4.0集群配置
113 0
|
3月前
|
运维 监控 安全
调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
83 0
|
3月前
|
存储 运维 应用服务中间件
[运维日志] Web 服务器日志依日期归档(Powershell 实现,附源代码)
[运维日志] Web 服务器日志依日期归档(Powershell 实现,附源代码)
74 0
|
4月前
|
Kubernetes Shell Linux
linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
60 0
|
1月前
|
存储 运维 监控
现代化运维管理:提升企业效率与安全
随着信息技术的快速发展,企业对于运维管理的需求日益增长。本文将探讨现代化运维管理在提升企业效率和安全方面的重要作用,介绍了一些最佳实践和工具,帮助企业更好地应对挑战。
|
1月前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
62 0
|
3月前
|
存储 运维 安全
1Panel开源Linux服务器运维管理面板
1Panel开源Linux服务器运维管理面板
118 0
|
3月前
|
运维 监控 安全
【优化篇】调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
【优化篇】调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
71 0
|
3月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
49 0
|
3月前
|
分布式计算 Hadoop Java
linux上面hadoop配置集群
linux上面hadoop配置集群
46 0

热门文章

最新文章