豌豆贴心提醒,本文阅读时间7分钟
没有绝对的安全
在上一篇文章《linux服务器安全配置实例(一)》中介绍了我对ssh服务的一些常用的安全配置和性能优化。
其实ssh服务是我们进入服务器的一扇大门,这扇大门是提供正常人使用钥匙打开后进屋的。而对于一些恶意的小伙伴,他们会使用一些非法的方式,比如走窗户、暴力开锁等去不经过我们的同意就进屋大肆破坏。
走窗户:通过一些系统的0day漏洞或者第三方服务以及软件的漏洞溢出或者注入,在服务器中运行恶意的代码来得到登陆权限。
暴力开锁:通过一些暴力破解软件,暴力破解我们的ssh服务、网站管理员密码等。
对于暴力开锁我们在对sshd服务器安全配置和优化中已经说明如何防范。对于走窗户、跳烟囱这样采用漏洞攻击的方式,我们最简单的方式就是及时修复漏洞,配置防火墙和杀毒软件等。
当然在一些大型的企业、政府的办公环境下,网络安全是十分主要的,自然会加入更多的安全机制,如:入侵检测系统、安全网关、网闸、堡垒机等。其实无论我们如何配置或者加入无数安全机制,都是没有绝对的安全的。没有绝对安全这句话是在网络安全圈子内最流行的一句话。
漏洞的产生是防不胜防的,我们曾经依托于openssl去保护我们的信息传输过程中不被第三方嗅探到内容,但是万万没想到的心脏大出血漏洞出现了。我们曾经呐喊着Linux服务器是最安全的(没错,因为linux操作系统用的人少,它的安全机制也确实十分完善),但是没有一点点防备的bash破壳漏洞出现了。
攻击者的目标:root权限
当这些漏洞被挖掘出来,无论漏洞公布者是出于学术交流还是炫耀自己多么牛逼,那么当公布出来的那一刻就意味着成千上万的服务器造成严重的威胁。其实不公布才是最可怕的!所以我们无法预测漏洞合适会出现,也无法预计自己的服务器是否会被人利用。那么我们可以假设:我的服务器被攻陷后怎么办?
其实在漏洞凌完成后,第二部就是拿到登陆服务器的权限。所以我们可以很确定的说,用户权限就是恶意攻击者的下一个目标。linux、unix操作系统的最高权限都是root,其uid为0。
这个用户权限拥有至高无上的能力。所以恶意攻击者会用各种手段去获取root权限。获取root权限也常在安卓手机中使用,安卓操作系统也是linux的分支,所以当安卓root后手机将不会安全,任何进程都可以使用setuid()系统调用,设置自己进程拥有root权限,那么木马病毒也不例外了。所以完全杜绝使用root用户在服务器中启动任何服务,使用私有用户去启动进程,同时禁止root用户登录。也就是在恶意攻击者通过对服务进程漏洞攻击后,拿到的用户权限不是root,同时利用一些系统内核级的漏洞对root进行提权也是无法登录的。对私有用户的活动目录进行限制,提权操作也更是难上加难。
防御技巧
下面详细说明一下账户权限和目录权限的配置。
1.禁止root
禁止root登陆有2个地方可以配置,第一个在ssh服务中:
这一点在对sshd服务安全配置和优化已经说明了,具体配置可以点开链接查看。第二个就是在系统内使用su命令切换root用户了。其实这是一件挺麻烦的事情,我们知道对系统一些更改、安装软件、升级系统都需要root权限。那么为了安全我们需要禁用它,为了配置系统我们又要使用它,自相矛盾了。这里给出2种解决矛盾的方法:
彻底禁用root登陆,使用sudo。
root可以使用su切换,但是禁止远程登陆。
这两种方法各有利弊,第一种完全可以杜绝root用户的使用,同时也很难对root提权。这里需要说明下sudo,sudo可以让普通用户拥有root用户的权限,例如在普通用户下使用
就可以直接在非root用户的情况下安装namp端口扫描工具。可以使用sudo命令的用户需要在/etc/sudoers文件中进行一些配置。
该配置文件的格式为:
用户或者组(组需要在组名前加%)主机=(用户) 执行的命令,如:
全句的意思是:授权根用户在所有计算机上以所有用户的身份运行所有文件。其实简单来说,我们可以在sudoers文件中配置哪些用户可以使用root权限执行哪些命令。
对于第一种方案,我们就是在禁用root以后通过sudo对系统进行一些修改,所以说sudo相当于拥有一定的root权限,因此sudo的权限也需要严格控制。这一点就有一些麻烦,通常建议为每个服务创建一个私有用户,倘若启动一些服务需要root权限,那么可以将需要root的命令配置到sudoers文件中。例如:为nginx创建了nginx私有用户,需要使用80端口,linux系统是不允许非root用户请求低端口的,一般有两种方案解决:1、创建使能2、在sudoers文件中配置如下:
而对于日常巡检系统升级需要用到root权限的命令也可以为巡检用户进行配置,如:
第一种方案麻烦就麻烦在需要每个用户都进行配置,但是权限细分安全有保证。
彻底禁用root登陆,当前用户为root下编辑/etc/shadow执行:
如果当前用户为非root下编辑/etc/shadow执行:
需要注意如果sudo没有权限,请通过root用户配置sudoers。
shadow文件保存了用户和密码等信息,每一列中间以:分割。
列1 定义与这个 shadow 条目相关联的特殊用户帐户。
列2 包含一个加密的密码。
列3 自 1/1/1970 起,密码被修改的天数
列4 密码将被允许修改之前的天数(0 表示“可在任何时间修改”)
列5 系统将强制用户修改为新密码之前的天数(1 表示“永远都不能修改”)
列6 密码过期之前,用户将被警告过期的天数(-1 表示“没有警告”)
列7 密码过期之后,系统自动禁用帐户的天数(-1 表示“永远不会禁用”)
列8 该帐户被禁用的天数(-1 表示“该帐户被启用”)
列9 保留供将来使用
在root用户的第二列之前加入!!,表示禁止该用户。
对shadow文件编辑完成后保存退出。
编辑/etc/passwd,执行
passwd文件保存了用户账户的基本信息,每一列中间以:分割。
列1 用户名,用户名在系统中是唯一的。
列2 用户密码列,新版本的unix/linux系统密码已经转移到/etc/shadow中。
列3 用户id(UID),UID是在系统中是唯一的,对于操作系统来说只认识UID,用户名是给用户看的。
列4 组id(GID),GID是在系统中是唯一的,对于操作系统来说只认识GID,组名称是给用户看的。
列5 用户全名,包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。
列6 用户home目录,该字段定义了个人用户的主目录,当用户登录后,他的Shell将把该目录作为用户的工作目录。
列7 命令解释程序(Shell),Shell是当用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名, 如/bin/bash。 注意如果需要禁止用户登录可以把该列改为/sbin/nologin。
根据上面的描述,可以将root用户的第七列改为/sbin/nologin,禁止root用户的登录。
2.创建私有用户
私有用户的意思是对每一个服务创建专用的用户来运行服务,比如nginx使用nginx用户运行,apache使用apache用户运行,mariadb使用MySQL用户运行等。私有用户包含了私有用户和私有用户组,私有用户组是指组中只有一个用户,如nginx组为nginx的私有用户。为每一个服务创建一个私有用户好处在于,当对外提供的服务由于不可预知的漏洞,恶意攻击者对服务进行溢出攻击,溢出的恶意代码执行成功后恶意攻击者拿到的用户权限也只是服务的私有用户,由于私有用户的权限非常低,所以减小了系统以及应用暴露的范围。使得危险可控。
对于服务,我们使用UID为100-999之间任意一个未被使用的UID,UID 1~99是保留给其它预定义用户的,UID 100~999是保留给系统用户的。而GID由于是私有组,建议与用户UID相同。
创建私有用户和普通用户一样,与普通用户区别在于:
针对服务UID在999以内,普通用户UID在999以后。
活动空间一般只在应用服务的安装路径,普通用户活动空间在/home下。
针对服务的私有用户只用于启动服务,禁止登陆,普通用户一般用于登陆。
使用groupadd创建组,-g参数指定组ID,即GID
使用useradd创建用户,-g参数指定GID,-u参数指定UID,-d参数指定用户的home目录,-s参数指定用户的shell程序,由于服务私有用户不需要远程登录,所以配置为/sbin/nologin
3.设置私有用户活动权限
对于服务的私有用户,需要对其目录访问权限进行一些设定,防止应用服务被渗透后,恶意攻击者在服务器中使用已有的权限乱搞。同时需要说明一下如何使用私有用户启动服务。需要注意的是,每个针对服务的私有用户权限配置都不同,但是基本配置方式都差不多,都是有规律可循的。首先我们需要确定应用服务的基本,即需要什么?变动什么?不变动什么?
需要什么?应用服务最基本提供的是用户的交互请求、数据存储和计算。所以可以看出应用服务需要提供端口来保证用户的请求,而对于数据存储需要提供存储空间。对于web容器我们需要一个合理的端口,大多为80。对于数据库和缓存我们需要一个合理的存储空间,这个空间大多与服务器操系统盘分开,以外挂数据盘的方式存在,当然数据库和缓存服务也需要端口。
变动什么?服务应用程序在运行时间必然会产生临时文件和日志,临时文件我们大多保存在/tmp下,对于日志有很多种:
syslog,大多在/var/log/message中
程序自己的日志空间
写入数据库,mongodb、mysql等
标准输出
不变动什么?应用服务的配置文件、库文件和可执行文件大多是不变的。在大多情况下,一个应用服务配置完成后启动对外服务,基本是不变的,但相对于库文件和可执行文件这种彻底不会变动的文件还算是可变。对于配置文件,与数据存储一样通常单独划分出来。
所以可以看出,我们只要需要把每个服务的日志文件、存储数据的文件、端口权限、执行文件和库文件进行授权。而对于其他目录和端口是不允许访问的。
这里使用nginx举例,我的nginx在服务器上的配置如下:
安装路径/srv/nginx
nginx的配置文件路径/data/config/nginx_config
nginx的日志和pid文件路径/data/var/nginx
nginx的服务端口为80
针对上面的配置需要对nginx用户进行授权,下面说一下具体如何授权。
在对每个目录进行授权之前,先确保这些目录父目录的所属用户和组都为root,同时保证父目录中的nginx目录是700的权限(当然最好父目录下的所有文件目录都是700),这样保证了nginx目录不被其他用户所访问。
修改/srv的权限:
修改/srv/nginx的权限:
修改/data/和/data/config的权限
修改/data/config/nginx_config的权限
修改/data/var/的权限
修改/data/var/nginx的权限
文件权限已经修改好了,接下来需要配置nginx能够使用80端口。之前说过可以使用sudoers文件给nginx用户root权限,还有一个方式就是让nginx的启动文件/srv/nginx/sbin/nginx进行使能操作。使能顾名思义,使其拥有一定能力,这里使能是请求低端口使能。
内核2.1以后使用
进行使能操作。
接下来再在nginx的配置文件nginx.conf中加入user nginx来配置nginx使用nginx这个用户运行。
四、删除没用的用户
linux系统中有很多没用的用户,这些用户可以直接删除掉不影响系统。系统内存在没用的用户可能会被恶意入侵者提权利用,存在很大的安全隐患。同样有一些没用的组也可以删除掉。
删除用户使用userdel命令:
删除用户组使用groupdel命令:
注意组中可能存在多个用户,同时组内存在用户的话系统是不让删除的,一般没用的用户组内的用户也大多是没用的,所以可以把组内用户全部删除掉再删除组。
下面列出可删除的用户:
adm、lp、sync、shutdown、halt、news、uucp、operator、games、gopher
下面列出可删除的用户组:
adm、lp、news、uucp、games、dip、ppusers、popusers、slipusers
用户账户权限配置做到这些就已经可以了,配置用户权限是个细致的活,尤其在不同用户活动空间和执行命令上配置需要谨慎,稍有遗漏都有可能会被恶意攻击者利用。通常我们会采用编写脚本方式对这些进行配置,如果对服务器脚本有兴趣的同学不妨钻研一下。
今日值班老师
马哥教育一号女神老师,懂IT更懂IT男。
专注解决Linux技术难题,是天生的技术专家。
如果你正好遇到了问题,为什么不找她求助一下?
Linux面授班,报名优惠400元,只有10个名额