文章目录
前言
sudo
命令应该是任何一个服务器使用人员都绕不开的命令,比如那个大名鼎鼎的删库跑路命令 sudo rm -rf /*
,虽然经常使用,也知道用它能做一些普通用户无法完成的事情,那么它究竟是什么意思,有什么作用和好处,和超级无敌的 root
用户又有什么关系呢?接下来我们来简单梳理一下。
关于sudo的一些疑问
sudo是什么
sudo
是一种在类 Unix 系统中使用的命令,用于以超级用户(superuser)的身份执行其他命令。它是 “Super User Do” 的缩写。超级用户通常是系统管理员,具有对操作系统的完全控制权。
当你以普通用户的身份登录到系统时,可能没有足够的权限来执行某些敏感的系统操作或访问某些文件。在这种情况下,可以使用 sudo
命令在临时提升权限的情况下执行特定命令。
使用 sudo
命令时,需要输入管理员密码以验证你的身份。一旦验证成功,就可以以超级用户的权限执行命令。这样可以确保系统安全,因为只有经过授权的用户才能执行特权操作。
例如,如果想要安装软件包或修改系统设置,但这些操作需要超级用户权限,你可以在命令前加上 sudo
,然后输入密码以执行该命令。
以下是一个sudo命令使用的示例:
sudo apt-get install git
这个命令将使用 apt-get
工具安装一个软件包,由于它需要对系统进行修改,所以需要超级用户权限。通过使用 sudo
,可以在普通用户的身份下临时获取这些权限来执行该操作。
sudo 和 root 的区别和联系
sudo
和 root
在类 Unix 系统中具有不同的角色和功能。以下是它们之间的区别和联系:
-
权限级别:
root
是超级用户,也称为系统管理员。拥有root
权限意味着拥有对整个系统的完全控制权,可以执行所有操作并访问所有文件。相比之下,sudo
是一个命令,允许普通用户在需要时以超级用户的身份执行特定的命令。 -
使用方式:
root
用户可以直接登录到系统并拥有持久的超级用户权限。而sudo
是一种临时提升权限的机制,允许普通用户在需要时以超级用户的身份执行特定命令。普通用户可以使用sudo
命令来运行特权命令,但在执行时需要输入管理员密码进行身份验证。 -
安全性:
sudo
的使用可以提高系统的安全性。通过限制普通用户的特权,只有在需要执行特定任务时才临时提升权限,可以减少意外或恶意操作造成的潜在风险。相比之下,root
用户拥有系统的完全权限,因此使用root
用户执行命令时需要格外小心,以免对系统造成损坏。 -
日常操作: 为了提高系统安全性,通常建议使用
sudo
来执行需要特权的命令,而不是直接使用root
用户。使用sudo
可以在普通用户的身份下执行特权命令,并避免了在常规操作中长时间保持root
权限,从而减少了潜在的错误或安全风险。
总结来说,root
是系统的超级用户,拥有完全的权限,而 sudo
是一种临时提升权限的机制,允许普通用户以超级用户的身份执行特定命令。使用 sudo
可以提高系统的安全性,同时避免在日常操作中过多使用 root
用户带来的潜在风险。
使用 sudo 的好处
使用 sudo
有以下几个好处:
-
安全性:
sudo
增加了系统的安全性。通过限制普通用户的特权,只有在需要执行特定任务时才临时提升权限,可以减少潜在的错误或恶意操作对系统造成的风险。普通用户在执行需要特权的命令时需要输入管理员密码,这种身份验证确保只有经过授权的用户才能执行特权操作。 -
权限控制:
sudo
允许系统管理员细粒度地控制用户对系统资源和命令的访问权限。管理员可以通过配置sudo
的策略文件,精确地指定哪些用户可以执行哪些命令以及以何种方式执行。这种权限控制有助于实施最小权限原则,即用户只能以最低权限执行任务,从而降低了潜在的安全风险。 -
审计和日志记录:
sudo
提供了审计和日志记录功能,可以记录执行特权操作的用户、时间和执行的命令。这对于追踪系统中的活动、故障排查和安全审计非常有价值。通过审计和日志记录,管理员可以了解特权操作的细节,以及哪些用户在何时执行了哪些命令。 -
限制特权操作: 使用
sudo
可以限制特权操作的范围。普通用户只有在需要执行特定命令时才能使用sudo
提升权限。这种限制可以避免用户误操作或滥用超级用户权限,从而减少了对系统的潜在风险。
总而言之,使用 sudo
可以提高系统的安全性、实施最小权限原则、提供审计和日志记录功能,并限制特权操作的范围。这使得系统管理员能够更好地管理用户权限并降低潜在的风险。
怎样查看sudo命令日志
可以使用适当的文本编辑器打开 sudo 日志文件:选择适用于你的系统的文本编辑器(如 nano、vim、或者其他)以超级用户权限打开 sudo 日志文件。日志文件的位置和名称可能会因操作系统的不同而异。下面是一些常见的 sudo 日志文件路径:
-
Ubuntu、Debian 等基于 Debian 的系统:
sudo nano /var/log/auth.log
-
CentOS、Fedora、Red Hat 等基于 Red Hat 的系统:
sudo nano /var/log/secure
-
macOS:
sudo nano /var/log/system.log
查看 sudo 日志文件通常需要管理员或超级用户权限。确保你具有足够的权限才能访问和查看日志文件。此外,一些操作系统可能还提供了特定的命令或工具来查看系统日志,例如 journalctl
命令在某些 Linux 发行版中可用于查看系统日志。你可以根据你的操作系统和日志管理方式来选择适合的方法来查看 sudo 日志。
修改sudo配置
sudo的配置文件是 /etc/sudoers
但是不建议直接用文本工具打开它,一旦修改出错可能导致很多严重问题,可以使用 visudo
命令进行打开编辑,使用 visudo
命令编辑 sudoers 文件时,系统会执行语法检查以确保配置的正确性,以避免可能的权限问题,下面展示一个简单配置样例:
简单样例
# User privilege specification
root ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# Allow members of group admin to execute any command
%admin ALL=(ALL:ALL) ALL
# Allow specific user to run specific command as another user
johndoe ALL=(appuser) /usr/local/bin/git
visudo
是一个用于编辑 sudoers 文件的命令,该文件包含了与 sudo(以管理员权限执行命令)相关的配置信息。在 sudoers 文件中,每一行都由多个列组成,其中包含不同的字段和含义。以下是 sudoers 文件中各列的一般含义:
-
列1:用户列表
- 该列指定了可以使用 sudo 命令的用户或用户组。
- 可以是单个用户名,如 “bob”。
- 可以是用户组前缀 “%” 后跟用户组名,如 “%admin”。
-
列2:主机列表
- 该列指定了可以在哪些主机上使用 sudo 命令。
- 可以是单个主机名,如 “localhost”。
- 可以是主机名前缀 “ALL”,表示适用于所有主机。
-
列3:=(运行 as) 列表
- 该列指定了可以以哪个用户身份来运行命令。
- 可以是单个用户名,如 “root”。
- 可以是用户组前缀 “ALL”,表示可以以任何用户身份运行命令。
- =(ALL:ALL):表示可以以任何用户身份 (ALL) 在任何终端 (ALL) 上运行命令。
-
列4:NOPASSWD: 标志
- 该列指定了是否需要输入密码才能使用 sudo 命令。
- 如果列中包含 “NOPASSWD:”,则表示不需要密码。
- 如果列为空或未包含 “NOPASSWD:”,则需要输入密码。
-
列5及以后:命令列表
- 该列指定了可以使用 sudo 命令执行的具体命令。
- 可以是完整的命令路径,如 “/usr/bin/apt-get”。
- 可以是通配符,如 “/usr/bin/*” 表示该目录下的所有命令。
复杂样例及解释
下面是一个复杂一些的 visudo 配置示例,其中包含了多个用户、用户组和命令的授权规则:
# User privilege specification
## Allow root to run any commands on all hosts
root ALL=(ALL:ALL) ALL
## Allow members of the admin group to run any commands on all hosts
%admin ALL=(ALL:ALL) ALL
## Allow specific user to run specific commands as root without password
johndoe ALL=(root) NOPASSWD: /bin/ls, /usr/bin/apt-get
## Allow specific user to run commands in specific directories as another user
johndoe ALL=(appuser) /opt/app/bin/*
johndoe ALL=(backupuser) /var/backup/scripts/*
## Allow specific user to run specific command with arguments as root
johndoe ALL=(root) /usr/sbin/usermod [a-z]*
## Deny specific user to run any command
banneduser ALL=(ALL:ALL) ALL, !/usr/bin/*
## Allow members of the wheel group to run any commands on localhost without password
%wheel localhost=(ALL:ALL) NOPASSWD: ALL
## Allow users in the developer group to run specific commands with arguments
%developer ALL=(ALL:ALL) /usr/bin/git *, /usr/bin/make clean
## Allow users in the support group to restart specific services
%support ALL=(root) /usr/sbin/service apache2 restart, /usr/sbin/service nginx restart
上述配置说明不考虑注释行,含义如下:
- 第1行表示允许 root 用户在所有主机上以任何用户身份执行任何命令。
- 第3行表示允许 johndoe 用户作为 root 用户以无需密码的方式执行
/bin/ls
和/usr/bin/apt-get
命令。 - 第4行和第5行表示允许 johndoe 用户作为 appuser 用户或 backupuser 用户在特定目录下执行命令。
- 第6行表示允许 johndoe 用户作为 root 用户执行带有特定参数的
/usr/sbin/usermod
命令。 - 第7行表示禁止 banneduser 用户执行除
/usr/bin/*
之外的所有命令。 - 第8行表示允许 wheel 组的用户在 localhost 主机上以任何用户身份执行任何命令,且无需密码。
- 第9行表示允许 developer 组的用户执行带有特定参数的
/usr/bin/git
和/usr/bin/make
命令。 - 第10行表示允许 support 组的用户作为 root 用户重启特定服务。
使用sudo用户
创建用户并添加到 sudo 组
在 Linux 上创建用户并将其添加到 sudo
组,可以按照以下步骤进行操作:
-
打开终端:在操作系统中打开终端或命令行界面。
-
使用
adduser
命令创建新用户:sudo adduser newuser
这将提示你输入新用户的密码和其他详细信息。
-
将新用户添加到
sudo
组。可以使用usermod
命令执行此操作:sudo usermod -aG sudo newuser
这将将新用户
newuser
添加到sudo
组中。 -
验证用户是否成功添加到
sudo
组。你可以通过执行以下命令来检查用户所属的组:groups newuser
如果
sudo
组在列表中显示,表示用户已成功添加到sudo
组。
现在,新创建的用户已经添加到 sudo
组,拥有 sudo 权限。他们可以使用 sudo
命令以管理员权限执行特权操作。请确保将适当的权限授予新用户,以确保系统的安全性和合规性。
查看是否有sudo权限
可以通过id命令查看指定用户是否在 sudo
组内,比如下面的用户就在27(sudo)这个组内:
root@jenkins1604:~# id gyee
uid=1004(gyee) gid=1004(gyee) groups=1004(gyee),27(sudo)
也可以查看(sudo)组内是否包含当前用户:
root@jenkins1604:~# getent group sudo
sudo:x:27:admin,gyee
getent
是一个命令行工具,用于从系统数据库(如密码、组、主机、服务等)中获取条目的信息。它可以用于检索和显示与系统用户、组、网络服务和其他系统资源相关的信息 ,getent
命令的基本语法如下:
getent database entry
其中,database
表示要查询的数据库,而 entry
则表示要获取的数据库条目。 以下是一些常见的 getent
命令示例:
-
获取系统中所有用户的信息:
getent passwd
-
获取特定用户的信息:
getent passwd <username>
-
获取系统中所有组的信息:
getent group
-
获取特定组的信息:
getent group <groupname>
-
获取系统中所有网络服务的信息(/etc/services 文件中定义的服务):
getent services
没有sudo权限时执行会被记录
当没有sudo权限时,执行命令会输出以下信息,显示此操作被记录在案:
gyee@jenkins1604:/root$ sudo usermod -aG sudo gyee
[sudo] password for gyee:
gyee is not in the sudoers file. This incident will be reported.
可以查询系统安全日志
root@jenkins1604:~# cat /var/log/auth.log | grep gyee
May 26 22:07:13 machine sudo: gyee : user NOT in sudoers ; TTY=pts/1 ; PWD=/root ; USER=root ; COMMAND=/usr/sbin/usermod -aG sudo gyee
总结
sudo
是一种在类 Unix 系统中使用的命令,用于以超级用户(superuser)的身份执行其他命令root
是超级用户,拥有对整个系统的完全控制权,sudo
是一个允许普通用户在需要时以超级用户的身份执行特定的命令adduser
和useradd
都是在 Linux 系统上用于创建用户的命令,但adduser
命令更方便友好,尤其适用于交互式的用户创建getent
是一个命令行工具,用于从系统数据库(如密码、组、主机、服务等)中获取条目的信息