所谓系统加固就是利用手工配置及有关软件来提高系统安全性的过程。本文将向读者详细介绍利用开源软件Sudo来对Root权限进行控制和审计以加固Linux系统安全的具体操作方法。
一、Sudo的功能
Sudo是一款开源安全工具,最常用于对Root权限进行控制和审计。它的指导思想是“在保证人们能正常工作的条件下,尽量压缩授予他们的权限”。系统管理员不仅可以让指定的用户或用户组作为root用户或其它用户来运行某些命令,还能将指定的用户所输入的命令和参数作详细的记录。当然,该软件是可以免费下载的,具体地址是www.gratisoft.us/Sudo/download.html。
Sudo程序是一款在命令行方式下工作的安全工具,并且我们每次只执行一条命令。它支持的功能有:
◆命令日志:记录命令和参数。该功能用于跟踪用户输入的命令,尤其适合于进行系统审计。因为Sudo 会记录下所有作为root用户(或者规定的其他用户)的命令,所以许多管理员经常用它来替代root shell,以便记录下自己使用的命令,这不仅能增进系统安全,还能用来进行故障检修。
◆集中记录多个系统的日志:Sudo联合系统日志守护进程syslog后,能将所有日志集中存放在一个主机上。
◆命令限制:限定用户或者用户组能够使用的命令。
◆检票系统:检票系统通过在用户登录到Sudo时所创建的票据来设定时间限制。票据只在规定的时间内有效。每个新的命令都会刷新票据的预设时间,默认的预设时间是五分钟。现实中,该功能非常有用,有了它即使root用户离开系统时忘了注销的话,也不至于被其他可以接触到键盘的用户肆无忌惮的窥探系统。因为票据过期后,系统必须重新登录。所以,我们最好把有效时间尽量设的短一点,如默认有效时间五分钟。检票系统还可以用来清除用户的票据文件。
◆集中管理多个系统:Sudo 的配置一般写在/etc/Sudoers这个文件中,而该文件可以供多个系统所用,这样一来,我们就可以在一个主机上对这些系统进行集中管理了。
Sudo几乎支持所有的UNIX操作系统版本,但如果要从源代码进行安装的话,必须准备好C编译器和make工具。
二、Sudo 命令参数详解
利用Sudo,我们既可以让某个用户作为超级用户来执行某些命令,还可以让他作为其他用户来执行某些命令——这一点对于系统管理格外有用。Sudo命令的具体配置都可以在/etc/Sudoers文件中找到,该文件规定了某个命令是否可以被某特定的用户执行。
使用Sudo的前提条件是 ,用户必须已经具有了自己的用户名和口令。如果一个用户企图通过Sudo 来运行命令,但该用户却没有位于Sudoers文件中的话,系统将自动向管理员发送一封电子邮件,指出非授权用户正在访问系统。
如前所述,因为Sudo具有检票功能,所以用户登录Sudo 时,会发给他一张票据,默认情况下其有效时间为五分钟。不过,用户也可以通过带–v标志的Sudo命令来更新票据,这会为票据申请另外五分钟。命令如下所示:
Sudo –v
如果有非授权用户运行上面的命令的话,管理员将收到一封反映该事件的电子邮件。
同时,标志-v也会通知非授权用户,他是非法用户。如果该用户很顽固,又一次次输入该Sudo 命令,那么系统会再发一封电子邮件通知管理员。
无论登录的企图是否成功,Sudo 都会如实记录到默认的syslog(3)文件中。但是,我们也可以在Sudo 的配置文件改变这一行为。下表给出了Sudo命令的一些选项。
选项 |
选项名 |
描述 |
-V |
Version |
打印版本号,然后退出。 |
-h |
Help |
打印帮助信息,然后退出。 |
-l |
List |
列出所有当前用户允许和禁止的命令。 |
-v |
Validate |
将用户的票据更新为一个预配置的时间,默认时五分钟。如果需要的话,该用户必须再次输入用户口令。 |
-k |
Kill |
作废该用户的票据。执行该选项将命令用户重新输入用户口令以更新票据。 |
-K |
Sure kill |
彻底删除该用户的票据。之后再运行该选项时,用户必须用其用户名和口令进行登录。 |
-u |
User |
作为用户名规定的用户来运行特定的命令。这个由用户名规定的用户可以是root之外的任何用户。 如果您想入口一个uid,入口#uid代替该用户名。如果您想使用uid,可以用#uid代替该用户名。 |
三、安装Sudo
将Sudor 压缩包下载到我们指定的目录下,比如/root 目录。无论使用哪种操作系统,这些操作在任何系统下都是类似的。
⒈ 切换到压缩包所在的目录,然后将其解压,命令如下所示。需要注意的是,当您执行下面命令时,因为所用版本不一定相同,所以其中的版本号实具体情况加以修改:
tar –zxvf Sudo-1.6.3p5.tar.gz
⒉ 以上命令会新建一个目录,如Sudo-1.6.3p5,这要视您的版本而定。
⒊ 通过下列命令切换到Sudo 目录:
cd Sudo-1.6.3p5
⒋ 利用下列命令来创建makefile 和config.h文件,我们将用它们来配置Sudo:
./configure
⒌ 您也可以在./configure 命令中加入选项来定制Sudo 的安装。其实很简单,只要在/configure命令后边追加所需的选项即可。 要想了解各种可用的选项,请参阅/Sudo/INSTALL文件。
⒍ 您还可以编辑makefile 来改变默认的安装路径,也可以编辑/Sudo/INSTALL 文件中的其他配置。为此,我们需要先用文本编辑程序打开makefile 。例如,键入下列命令:
vi Makefile
⒎ 在makefile 文件中找到以“Where to install things ...”开头的段落,如图所示:
图1 Sudo的 Makefile文件
⒏ 如有必要,可以更改默认路径。但我们这里将使用默认路径。
⒐ 退出该文件。如果要使用vi 文本编辑程序的话,可以使用以下命令:
:q
⒑ 实际上,我们在前面运行./configure 命令时,也可以改变默认安装路径。为此,需要在该命令后面加上一个选项。例如,默认时Sudoers 文件是安装在/etc 目录的,我们可以利用下面的命令来改变这个文件的安装位置:
./configure - -sysconfdir=DIR
这里的DIR 就是新的安装目录。
⒒ 为编译Sudo ,需要运行make 命令:
make
⒓ 如果我们要把Sudo安装在源文件目录之外的地方的话,将需要用到GNU。 如果在安装期间出错的话,可以求助于TROUBLESHOOTING 文件和PORTING 文件。
⒔ 我们必须作为root 用户才能安装Sudo,因为这需要使用超级用户权限。变成root 用户后,运行make install 命令安装手册页、viSudo和Sudoers 文件:
make install
需要提醒的是,千万不可以覆盖任何现有的Sudoers 文件。
⒕ 好了,我们已将Sudo 安装好了,接下来介绍如何进行配置以满足我们的需求。
四、配置Sudo
要配置Sudo ,我们必须对%/Sudo-1.6.9p5/Sudoers 文件进行编辑,该文件中定义了哪些用户可以执行哪些命令。此外,只有root用户才有编辑该文件的权限,并且还必须用viSudo 命令对其编辑。在Sudo 目录中,包含了一个名为sample.Sudoers 的示例文件:
默认时,viSudo命令会使用vi 文本编辑程序打开Sudoers 文件。当然,我们可以通过编译选项来让viSudo 改变默认的文本编辑程序。viSudo使用环境变量EDITOR表示文本编辑程序。在编辑Sudoers 文件时,viSudo命令会执行以下任务:
(一) 检查语法错
即使在修改中找到一个语法错误,viSudo也不会保存所做的修改。当发现语法错误时,它会指出错误所在的行号,并给出相应的指导性的提示。这时,我们会看到一个“What Now ?”提示和三个选项:“e”表示重新编辑文件;“x”表示退出并且不作任何保存;“Q”表示退出并保存更改的内容。如果Sudoers 文件存在语法错误,而我们又选择Q退出并保存viSudo的修改的话,那么我们是无法正常运行Sudo的,直到语法问题得到纠正为止。遇到这种情况,我们必须再一次运行viSudo,修正错误,然后再次保存文件。当修正问题时,最好选择e项;如果您对于正误还心存顾虑时,可以选择x项,这样在退出时便不会变成修改了。
(二) 防止同时对该文件进行多重编辑
当我们在编辑Sudoers 文件的时候运行viSudo的话,将收到一个错误信息,让我们稍后再试。Sudoers 文件由两种类型的条目组成:用户规定和别名。下面用实例介绍如何使用用户规定条目来定义哪些用户可以运行哪些命令。别名基本上就是一些变量。
Sudoers文件中包含一个root条目,默认的权限规定如下所示:
root ALL = (ALL ) ALL
该配置允许root用户可以执行所有命令。
要想让其他用户作为root 来运行命令,我们必须将这些用户加入到Sudoers 文件中。我们还必须规定允许在哪些主机上运行这些命令。最后,我们还必须列出这些用户可以作为root 来运行的具体命令。在下面的步骤中,我们将创建用户bob ,并允许他作为root 用户在我们的机器上执行某些命令。
⒈ 打开该Sudoers文件,命令如下所示:
viSudo
⒉ Sudoers 文件将在vi 中打开,在其中找到“User privilege specification”部分。然后在root 条目之后,按i键插入下面一项:
bob your-hostname = /sbin/ifconfig, /bin/kill, /bin/ls
⒊ 这一行的作用是允许用户bob作为root用户来执行命令ifconfig、kill和ls。
需要注意的是,除非您有另行规定,否则默认凡是列在Sudoers 文件中的命令,都将作为root用户来运行。比如,我们可以让用户bob作为用户Tom来运行命令。命令如下所示:
bob your-hostname = (Tom) /sbin/ifconfig
就本例来说,ifconfig命令将以用户Tom 的身份来执行。当然,您可以允给bob 以多种不同的用户身份来执行命令,比如:
bob your-hostname = (Tom) /sbin/ifconfig, (root) /bin/kill, /bin/ls
其中,kill 和ls 命令将作为root用户来运行,而ifconfig命令则作为用户Tom来执行。Bob可以在命令行中键入以下命令:
Sudo –u Tom /sbin/ifconfig
⒋ 按下ESC写入并退出文件,然后键入以下命令:
:wq
这个命令利用vi写并退出该文件。
⒌ 现在,我们需要建立用户bob,命令如下:
五、运行Sudo
我们已经配置Sudo,让它给予用户bob以超级用户权限来执行ifconfig、kill和ls命令。当bob 要运行这些命令时,他必须键入Sudo 命令,并输入其口令。
⒈ 首先作为用户bob登录。
⒉ 找出bob可以作为root用户执行的命令,为此,键入以下命令:
Sudo –l
⒊ 如果第一次以用户bob的身份运行Sudo 的话,会给出一个警告:
We trust you have received the usual lecture from the local System Administrator.
It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type
#3) With great power comes great responsibility
⒋ 提示您输入口令,注意,不要输入root用户的口令,而是bob的口令。
Password:
⒌ 将列出允许bob在这个主机上运行的各个命令,如下所示:
User bob may run the following commands on this host:
(root) /sbin/ifconfig
(root) /bin/lill
(root) /bin/ls
⒍ 运行ifconfig 来测试我们Sudo的配置情况。如果不用Sudo 的话,该选项需要root权限。命令如下所示:
/sbin/ifconfig eth0 down
该命令无效,因为bob无权停用系统的连接设备。
⒎ 为了停用该连接设备,bob 必须使用Sudo ,命令如下所示:
Sudo /sbin/ifconfig eth0 down
这次将会成功执行。请注意,如果bob 的票据已经过期(默认有效期为五分钟)的话,Sudo会要求输入bob的口令。 如果我们在票据的有效期内运行这个命令的话,系统不会提示我们键入口令。
⒏ 用以下命令来重新激活该连接设备:
Sudo /sbin/ifconfig eth0 up
⒐ 然后,利用kill命令重新启动httpd 进程,具体如下所示:
ps aux | grep httpd
⒑ 从显示的列表中选择一个Apache PID ;如果没有安装Apache 的话,也可以选择启动其他的服务进程。命令如下:
kill –HUP [PID NUMBER]
⒒ 它是不会让你重启httpd进程的,因为你不是root用户。所以会收到如下信息:
bash: kill: (PID NUMBER) – Not owner
⒓ 现在,我们改为使用Sudo作为root用户来运行该命令,具体如下所示:
Sudo kill –HUP (PID NUMBER)
这回成功了。
⒔ 接下来,我们以用户bob的身份利用ls 命令来显示root目录。命令如下所示:
ls /root
结果我们被拒绝了,因为我们不是root用户。
⒕ 好了,现在我们使用Sudo作为root用户执行该命令,看看结果如何:
Sudo ls /root
看到了吧,我们的请求被执行了。root用户的目录已经列出来了。
⒖ 为了使bob的时间戳过期,可以通过Sudo –k命令来达此目的。这样一来,bob 下一次使用Sudo时就必须再次输入口令。
六、无需口令的情形
有些情况下,没有必要每次运行Sudo时都得输入口令,因为该用户已经登录到系统上了。所以,Sudo 为我们提供了一种有效的方法来避免这种单调乏味的任务,办法就是在Sudoers 文件中加入NOPASSWD 标签。
⒈ 为了在Sudoers文件中取消对口令的要求,请登录为root 用户,然后键入以下命令:
viSudo
⒉ Sudoers 文件会在vi 中打开。修改bob 的用户权限规定,如下所示:
bob your-hostname = NOPASSWD: /sbin/ifconfig, /bin/kill, /bin/ls
⒊ 按ESC键,然后键入:wq 来写入并退出文件:
⒋ 登录为bob ,用下列命令来停用连接设备:
Sudo /sbin/ifconfig eth0 down
这次不会要求我们输入口令了,因为该命令将作为root用户来运行。
七、Sudo的日志功能
前面已经说过,Sudo能够记录各用户都运行了哪些命令。但是,这些需要对Sudo 和syslogd 进行适当的配置。为此,我们首先要在/var/log目录中创建一个日志文件,还必须对syslog.conf进行相应的配置,让它记录Sudo 命令。配置Sudo 日志功能的具体步骤如下所示:
⒈ 登录为root 用户,然后在/var/log/目录下创建一个Sudo 日志文件。具体命令如下所示:
touch /var/log/Sudo
⒉ 之后,您必须在syslog.conf 文件中添加相应的行来命令它将记录放到Sudo的日志文件。我们可以用下列命令来打开syslog.conf:
vi /etc/syslog.conf
⒊ 将下面一行命令放到syslog.conf文件的末尾。操作时,我们可以通过按下i键来插入文字。要注意,下面的空格必须使用TAB 键,而不是空格键。
local2.debug /var/log/Sudo
⒋ 这个syslog.conf条目会将所有成功和不成功的Sudo 命令都记录到文件/var/log/Sudo中。您还可以通过用网络主机代替本机目录来让日志记录到一个网络主机上。syslog.conf文件如图2所示。
图2 编辑syslog.conf文件进行日志记录
⒌ 按下ESC写入并退出文件,然后键入以下命令:
:wq
⒍ 因为syslog.conf文件已经修改,所以必须重新启动syslogd 。要向syslogd 发送HUP信号,必须首先知道syslogd 进程标识符,为此键入以下命令来获取syslogd PID :
ps aux | grep syslogd
第二栏表示显示PID号码,最后一栏表示显示PID 对应的进程。
⒎ 要重启syslogd ,从上面命令输出中找出syslogdPID ,然后键入以下命令:
kill –HUP [PID NUMBER]
⒏ 因为我们想为用户bob建立日志条目,所以作为用户bob登录。
⒐ 以用户bob的身份登录后,键入以下ifconfig命令:
Sudo –l
Sudo /sbin/ifconfig eth0 down
Sudo /sbin/ifconfig eth0 up
⒑ 利用kill 命令重新启动httpd进程(或者其它进程),命令如下所示:
ps aux | grep httpd
⒒ 从以上命令的输出中找出Apache (httpd )PID ,并输入下列命令:
Sudo kill –HUP [PID NUMBER]
⒓ 现在,将以用户bob的身份列出root用户目录,具体命令如下所示:
Sudo ls /root
⒔ 作为root 用户登录,查看一下Sudo 日志文件。bob 输入的全部Sudo 命令都被记下来了,如下所示:
May 18 21:10:18 localhost Sudo: bob: TTY=pts/1;PWD=/home/bob;USER=root; COMMAND=list
May 18 21:10:28 localhost Sudo: bob: TTY=pts/1;PWD=/home/bob;USER=root; COMMAND=/sbin/ifconfig eth0 down
May 18 21:10:50 localhost Sudo: bob: TTY=pts/1;PWD=/home/bob;USER=root; COMMAND=/sbin/ifconfig eth0 up
May 18 21:10:60 localhost Sudo: bob: TTY=pts/1;PWD=/home/bob;USER=root; COMMAND=/bin/ls /root
⒕ 您可以记录任何root命令,方法很简单,只要在这些命令之前加上Sudo 即可。例如,要记录下所有作为root使用的命令,可以像下面这样做:
Sudo useradd susan
Sudo passwd susan
Sudo vi /hosts
⒖ 要想访问和查看Sudo 日志文件,我们可以使用下列命令:
Root用户的所有输入都将记录在案,包括刚刚输入的cat 命令。如下所示:
May 18 21:10:18 localhost Sudo: bob: TTY=pts/1;PWD=/home/bob;USER=root; COMMAND=list
May 18 21:10:28 localhost Sudo: bob: TTY=pts/1;PWD=/home/bob;USER=root; COMMAND=/sbin/ifconfig eth0 down
May 18 21:10:50 localhost Sudo: bob: TTY=pts/1;PWD=/home/bob;USER=root; COMMAND=/sbin/ifconfig eth0 up
May 18 21:10:60 localhost Sudo: bob: TTY=pts/1;PWD=/home/bob;USER=root; COMMAND=/bin/ls /root
May 18 21:30:22 localhost Sudo: root: TTY=pts/1;PWD=/root;USER=root; COMMAND=/usr/sbin/useradd susan
May 18 21:30:56 localhost Sudo: root: TTY=pts/1;PWD=/root;USER=root; COMMAND=/usr/bin/passwd susan
May 18 21:31:18 localhost Sudo: root: TTY=pts/1;PWD=/root;USER=root; COMMAND=/bin/vi /hosts
May 18 21:31:30 localhost Sudo: root: TTY=pts/1;PWD=/root;USER=root; COMMAND=/bin/vi /etc/hosts
May 18 21:32:11 localhost Sudo: root: TTY=pts/1;PWD=/root;USER=root; COMMAND=/bin/cat /var/log/Sudo
如您所见,Sudo 对于控制和审计root用户的访问权限是极其有益的。它使得系统管理员可以将root用户的系统管理任务分配给其他人,而无需给予他们root口令。管理员也可以根据每个用户实际所需的root访问权限来定制系统访问权限,从而达到权限最小化的目标。
八、结束语
Sudo是一款实用的安全管理软件,通过它对超级用户权限进行有效的控制和审计能有效的提高系统的安全性。本文主要讨论了Sudo的Sudoers文件的用户规定方面,如果您想了解其他方面的话,www.gratisoft.us/Sudo/man/Sudo.html上的Sudo man手册会对您有所帮助。