学习怎么在保护 root 密码的安全性的同时,为可信用户赋予所管理的网络功能和特定服务的权限。
我最近写了一个简短的 Bash 程序来将 MP3 文件从一台网络主机的 USB 盘中拷贝到另一台网络主机上去。拷贝出来的文件存放在一台志愿者组织所属服务器的特定目录下,在那里,这些文件可以被下载和播放。
我的程序还会做些其他事情,比如为了自动在网页上根据日期排序,在拷贝文件之前会先对这些文件重命名。在验证拷贝完成后,还会删掉 USB 盘中的所有文件。这个小程序还有一些其他选项,比如 -h 会显示帮助, -t 进入测试模式等等。
我的程序需要以 root 运行才能发挥作用。然而,这个组织中之后很少的人对管理音频和计算机系统有兴趣的,这使得我不得不找那些半吊子的人来,并培训他们登录到用于传输的计算机,运行这个小程序。
倒不是说我不能亲自运行这个程序,但由于外出和疾病等等各种原因, 我不是时常在场的。 即使我在场,作为一名 “懒惰的系统管理员”, 我也希望别人能替我把事情给做了。 因此我写了一些脚本来自动完成这些任务并通过 sudo 来指定某些人来运行这些脚本。 很多 Linux 命令都需要用户以 root 身份来运行。 sudo 能够保护系统免遭一时糊涂造成的意外损坏以及恶意用户的故意破坏。
尽可能的使用 sudosudo 是一个很方便的工具,它让我一个具有 root 权限的管理员可以分配所有或者部分管理性的任务给其他用户, 而且还无需告诉他们 root 密码, 从而保证主机的高安全性。
假设,我给了普通用户 ruser 访问我 Bash 程序 myprog 的权限, 而这个程序的部分功能需要 root 权限。 那么该用户可以以 ruser 的身份登录,然后通过以下命令运行 myprog。
sudo myprog
sudo 程序会检查 /etc/sudoers 文件,并确认 ruser 是否被许可运行 myprog。如被许可,sudo 会要求该用户输入其密码——而非 root 密码。在 ruser 输入他的密码之后,该程序就运行了。此外,sudo 也记录 myprog 该程序运行的日期和时间、完整的命令,以及谁在运行它。这个数据会记录在 /var/log/security 中。
我发现在培训时记录下每个用 sudo 执行的命令会很有帮助。我可以看到谁执行了哪些命令,他们是否输对了。
我委派了权限给自己和另一个人来运行那一个程序;然而,sudo 可以做更多的事情。 它允许系统管理员委派所管理的网络功能或特定的服务给某个受信的人或某组人。这可以让你在保护了 root 密码的安全性的同时,也赋予了那些功能。
配置 sudoers 文件作为一名系统管理员,我使用 /etc/sudoers 文件来设置某些用户或某些用户组可以访问某个命令,或某组命令,或所有命令。 这种灵活性是使用 sudo 进行委派时能兼顾功能与简易性的关键。
我一开始对 sudoers 文件感到很困惑,因此下面我会拷贝并分解我所使用主机上的完整 sudoers 文件。 希望在分析的过程中不会让你感到困惑。 我意外地发现, 基于 Red Hat 的发行版中默认的配置文件都会很多注释以及例子来指导你如何做出修改,这使得修改配置文件变得简单了很多,也不需要在互联网上搜索那么多东西了。
不要直接用编辑器来修改 sudoers 文件,而应该用 visudo 命令,因为该命令会在你保存并退出编辑器后就立即生效这些变更。 visudo 也可以使用除了 Vi 之外的其他编辑器。
让我们首先来分析一下文件中的各种别名。
主机别名主机别名这一节用于创建主机分组,授予该组主机可以访问哪些命令或命令别名。 它的基本思想是,该文件由组织中的所有主机共同维护,然后拷贝到每台主机中的 /etc 中。 其中有些主机, 例如各种服务器, 可以配置成一个组来赋予用户访问特定命令的权限, 比如可以启停类似 HTTPD、DNS 以及网络服务;可以挂载文件系统等等。
在设置主机别名时也可以用 IP 地址替代主机名。
##HostAliases
##Groups of machines.You may prefer to use hostnames (perhaps using
## wildcards for entire domains)or IP addresses instead.
#Host_Alias FILESERVERS = fs1, fs2
#Host_Alias MAILSERVERS = smtp, smtp2
用户别名