对于使用Linux的程序员来说,一个最经常听到的忠告就是不要使用root用户,而是使用sudo
但是你有没有想过,究竟使用root与使用sudo有什么差别?今天就来聊一聊这个事。
超级用户root
在Linux操作系统中,root是超级用户。它是权限最大用户,它几乎可以执行任意操作,从运行命令到访问或删除文件 (SELinux部分限制除外)
因此使用它是危险的。
一个经典的案例就是在你的Linux上使用root执行以下命令
rm -rf /
你将会删除整个Linux系统上的一切文件。
几年前我真的确遇到过有同事当初不小心在一个测试环境执行过这个命令,本意是删除当前目录rm -rf ./,但少打了个点,导致了这个后果。不过还好只是测试环境,影响不大。
多用户与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这个文件的内容我们可以看到
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
这个定义的意思是,允许sudo这个group组的所有用户,执行所有命令,这是默认的配置。
但我们可以基于这个配置,做到更精细的控制。
fish ALL=(ALL) /bin/ls /bin/cd
这行配置的意思是,只允许fish这个用户,执行/bin/ls,/bin/cd这两个命令。这意味着我们对fish这个用户做了更细致的控制。虽然它也是sudo用户。
当fish执行一些需要sudo但又没有赋予给它的命令时,就会出现如下的错误
Sorry, user fish is not allowed to execute '/usr/bin/apt update' as root.
审计支持
稍微想像一下吧,都用root,未来没有谁能说得清,究竟是谁,在什么时候,做了什么操作。出现问题或故障时难以追踪。
而使用sudo,则可以轻松解决这个问题,不同的人使用自己单独的用户帐号,不同运营或管理人员在服务器上的操作日志一目了解,有迹可寻。
在安全上,这是非常重要的一个点了。
不要再使用root
现在,你应该明白了,为什么你不应该再去共享与传播root帐号了。在Linux下,养成使用sudo的习惯是非常有必要的。
每次我新建一个Linux系统,第一件事就是新增一个用户,并赋予它sudo权限。
