Linux中root与sudo的区别
简介
Linux 下面有两个概念可能大家接触的比较多,一个是 sudo 命令,还有一个是 root 账户。Sudo 命令可以以最高权限执行命令,而 root 账户下所有命令都有最高权限,也就是相当于所有命令都默认加了 sudo。
对于使用Linux的程序员来说,一个最经常听到的忠告就是不要使用root用户,而是使用sudo
那么 sudo 和 root 的区别到底是什么呢,为什么我们建议使用 sudo 而不是直接使用 root 账户?
但是你有没有想过,究竟使用root与使用sudo有什么差别?今天就来聊一聊这个事。
超级用户root
在Linux操作系统中,root是超级用户。它是权限最大用户,它几乎可以执行任意操作,从运行命令到访问或删除文件 (SELinux部分限制除外)
root 是指 Linux 等类 Unix 系统中的超级用户帐户。它是用于系统管理的系统上具有最高访问权限的特权帐户。此根/超级用户帐户的用户标识符 (UID) 为零,无论帐户名称如何。
root 用户拥有整个系统的完全权限(root 特权)。它可以做诸如修改系统的核心部分、升级系统、更改系统配置以及启动、停止和重新启动所有正在运行的系统服务之类的事情。
因此使用它是危险的。
一个经典的案例就是在你的Linux上使用root执行以下命令
1 | rm -rf / |
你将会删除整个Linux系统上的一切文件。
几年前我真的确遇到过有同事当初不小心在一个测试环境执行过这个命令,本意是删除当前目录rm -rf ./
,但少打了个点,导致了这个后果。不过还好只是测试环境,影响不大。
什么是 Sudo?
sudo
(superuser do) 命令是一个命令行实用程序
,它允许用户以 root 或其他用户身份执行命令。它提供了一种有效的方式来授予某些用户适当的权限以使用特定的系统命令或以 root 用户身份运行脚本。
虽然有点类似于 su 命令,但 sudo 的不同之处在于它默认需要用户的密码进行身份验证,而不是 su 需要的目标用户的密码。Sudo 也不会产生 root shell;相反,它以提升的权限运行程序或命令,不像 su,它产生一个 root shell。
使用 sudo,系统管理员可以执行以下操作:
- 授予用户或用户组以提升或 root 权限运行某些命令的能力。
- 查看每个使用 sudo 的用户的用户 ID 的日志。
- 控制用户可以在主机系统上使用什么命令。
Sudo 会记录在 /var/log/auth.log 文件中执行的所有命令和参数的日志,可以在出现故障时进行分析。
多用户与sudo
Linux用户系统是允许多用户的,对于服务器来说它是非常必要的。这样不同的管理人员甚至是服务上不同的服务都可以使用不同的用户,这对于权限控制来说就非常方便。
但是在早期,除了root这个超级用户以外,其它用户都是普通用户。普通用户无法执行很多Linux中只有root用户才允许执行的操作。
最常见的比如安装软件,一般用户是无法安装软件的。这在过往就导致一个现象,就是root用户滥用,root用户的帐号密码会被许多人共享。
后面,为了解决这个问题,出现了sudo
,sudo就是赋予普通用户能够以root的权限去执行一些操作命令的权限。
一般稍微有安全常识的管理员,都会使用sudo的方式来赋予普通用户相应的权限,这就引发一个新的值得思考的问题,
使用sudo与直接使用root帐号究竟有什么区别?为什么会说使用sudo更安全?
sudo的优势
很多人只是简单的把sudo
理解为另一种形式的root (它们错误的以为sudo和root的权限是一样的),但只要稍微思考下,我们就能知道,使用sudo有一些优势,而这些优势对于服务器是极为重要甚至是不可或缺的点。
避免了root密码的传播
一旦使用sudo,而不是直接使用root,这就让我们可以将root用户保护起来,它的密码只允许个人别人知道。
而与之相反的是,使用root的话,不得不把root用户密码共享出来,仅从密码的安全性上就是个非常不好的点。
大多数人的密码都带有一定的偏向性,共享root密码让猜测密码与破解变得容易起来。
按需授权
有了sudo,我们就可以很轻松的做按需授权。只有要需要时,才赋予对应的用户相应的权限。这就非常易于权限的放开与回收控制。
按需授权包括两个维度,一个是时间维度,另一个是范围维度。这两个维度在sudo上都是支持的。
时间维度是指我们可以给一个用户在需要时赋予sudo权限,也可以在时间到期后回收这个sudo权限。
而权限范围维度可能很多人没有太使用过,其实sudo是可以指定权限范围的。
查看/etc/sudoers这个文件的内容我们可以看到
1 2 | # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL |
这个定义的意思是,允许sudo这个group组的所有用户,执行所有命令,这是默认的配置。
但我们可以基于这个配置,做到更精细的控制。
1 | fish ALL=(ALL) /bin/ls /bin/cd |
这行配置的意思是,只允许fish
这个用户,执行/bin/ls
,/bin/cd
这两个命令。这意味着我们对fish
这个用户做了更细致的控制。虽然它也是sudo用户。
当fish
执行一些需要sudo但又没有赋予给它的命令时,就会出现如下的错误
1 | Sorry, user fish is not allowed to execute '/usr/bin/apt update' as root. |
审计支持
稍微想像一下吧,都用root,未来没有谁能说得清,究竟是谁,在什么时候,做了什么操作。出现问题或故障时难以追踪。
而使用sudo,则可以轻松解决这个问题,不同的人使用自己单独的用户帐号,不同运营或管理人员在服务器上的操作日志一目了解,有迹可寻。
在安全上,这是非常重要的一个点了。
不要再使用root
现在,你应该明白了,为什么你不应该再去共享与传播root帐号了。在Linux下,养成使用sudo的习惯是非常有必要的。
每次我新建一个Linux系统,第一件事就是新增一个用户,并赋予它sudo
权限。
sudoers 文件
sudo 使用默认的 sudoers 安全策略,并保留一个特殊的配置文件 /etc/sudoers。该文件可用于控制访问权限和密码提示超时。
注意:您必须具有提升的权限才能查看 sudoers 文件
打开 /etc/sudoers 文件;它应该是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/ sbin:/bin" # Host alias specification # User alias specification # Cmnd alias specification # User privilege specification root ALL=(ALL:ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "@include" directives: @includedir /etc/sudoers.d |
其中这行:
1 | root ALL=(ALL:ALL)ALL |
意味着 root 用户拥有无限的权限并且能够在系统上运行任何命令。
1 | %sudo ALL=(ALL:ALL)ALL |
允许组 sudo 的所有成员执行任何命令。
注意
:sudoers 文件中的 ‘%’ 代表一个组,而不是注释。
从 /etc/sudoers 文件的第一行可以看出:
1 | # This file MUST be edited with the 'visudo' command as root |
不要尝试直接编辑 sudoers 文件。使用具有 root 权限的 visudo 命令。
使用 sudo 运行命令很简单,只需要在命令前面加上 sudo 即可:
1 | $ sudo command |
一般来说会提示输入密码,输入密码后回车即可。
1 2 | $ sudo command [sudo] password for user: |
sudo 对比 Root
最小权限原则是一种信息和计算机安全概念,它认为授予程序和用户执行任务所需的最少或最低限度的权限。
以 root 用户登录后,输入到终端的每一条命令都以系统最高权限运行,违反了最小权限原则。像 rm 这样的简单命令可用于删除核心根目录或文件,而不会在意外时提示用户。例如,如果您尝试使用以下命令删除 /etc 之类的根目录:
1 | $ rm -rf /etc |
当您以普通用户身份登录时,您将被拒绝许可。当以 root 身份登录时,不会显示任何提示,并且整个文件夹将被删除 – 这很可能会破坏您的系统,因为运行系统所需的特殊配置文件存储在 /etc 目录中。您也可能最终错误地格式化磁盘,并且系统不会提示您。
此缺陷还扩展到以 root 身份运行代码或应用程序;应用程序中的一个小错误可能会删除一些系统文件,因为该应用程序是在最高权限下运行的。
Sudo 提供细粒度的访问控制。它仅向需要它的特定程序授予提升的权限。您知道哪个程序以提升的权限运行,而不是使用 root shell(以 root 权限运行每个命令)。
Sudo 也可以配置为以另一个用户身份运行命令,指定允许哪些用户和组使用 sudo 运行命令,或者通过编辑 sudoers 文件设置以 root 权限运行程序的超时。
因此,不建议使用 root shell 运行命令,因为您破坏系统的机会要高得多。如果您需要更高权限或 root 权限来运行命令,请使用 sudo 确保只有该命令以 root 权限运行。
sudo无需输入密码
1 2 3 4 5 6 7 8 9 | vi /etc/sudoers oracle ALL=(ALL) NOPASSWD: ALL 输入wq! echo "oracle ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "grid ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers |