前言

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 的区别和联系

sudoroot 在类 Unix 系统中具有不同的角色和功能。以下是它们之间的区别和联系:

  1. 权限级别: root 是超级用户,也称为系统管理员。拥有 root 权限意味着拥有对整个系统的完全控制权,可以执行所有操作并访问所有文件。相比之下,sudo 是一个命令,允许普通用户在需要时以超级用户的身份执行特定的命令。

  2. 使用方式: root 用户可以直接登录到系统并拥有持久的超级用户权限。而 sudo 是一种临时提升权限的机制,允许普通用户在需要时以超级用户的身份执行特定命令。普通用户可以使用 sudo 命令来运行特权命令,但在执行时需要输入管理员密码进行身份验证。

  3. 安全性: sudo 的使用可以提高系统的安全性。通过限制普通用户的特权,只有在需要执行特定任务时才临时提升权限,可以减少意外或恶意操作造成的潜在风险。相比之下,root 用户拥有系统的完全权限,因此使用 root 用户执行命令时需要格外小心,以免对系统造成损坏。

  4. 日常操作: 为了提高系统安全性,通常建议使用 sudo 来执行需要特权的命令,而不是直接使用 root 用户。使用 sudo 可以在普通用户的身份下执行特权命令,并避免了在常规操作中长时间保持 root 权限,从而减少了潜在的错误或安全风险。

总结来说,root 是系统的超级用户,拥有完全的权限,而 sudo 是一种临时提升权限的机制,允许普通用户以超级用户的身份执行特定命令。使用 sudo 可以提高系统的安全性,同时避免在日常操作中过多使用 root 用户带来的潜在风险。

使用 sudo 的好处

使用 sudo 有以下几个好处:

  1. 安全性: sudo 增加了系统的安全性。通过限制普通用户的特权,只有在需要执行特定任务时才临时提升权限,可以减少潜在的错误或恶意操作对系统造成的风险。普通用户在执行需要特权的命令时需要输入管理员密码,这种身份验证确保只有经过授权的用户才能执行特权操作。

  2. 权限控制: sudo 允许系统管理员细粒度地控制用户对系统资源和命令的访问权限。管理员可以通过配置 sudo 的策略文件,精确地指定哪些用户可以执行哪些命令以及以何种方式执行。这种权限控制有助于实施最小权限原则,即用户只能以最低权限执行任务,从而降低了潜在的安全风险。

  3. 审计和日志记录: sudo 提供了审计和日志记录功能,可以记录执行特权操作的用户、时间和执行的命令。这对于追踪系统中的活动、故障排查和安全审计非常有价值。通过审计和日志记录,管理员可以了解特权操作的细节,以及哪些用户在何时执行了哪些命令。

  4. 限制特权操作: 使用 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. 列1:用户列表

    • 该列指定了可以使用 sudo 命令的用户或用户组。
    • 可以是单个用户名,如 “bob”。
    • 可以是用户组前缀 “%” 后跟用户组名,如 “%admin”。
  2. 列2:主机列表

    • 该列指定了可以在哪些主机上使用 sudo 命令。
    • 可以是单个主机名,如 “localhost”。
    • 可以是主机名前缀 “ALL”,表示适用于所有主机。
  3. 列3:=(运行 as) 列表

    • 该列指定了可以以哪个用户身份来运行命令。
    • 可以是单个用户名,如 “root”。
    • 可以是用户组前缀 “ALL”,表示可以以任何用户身份运行命令。
    • =(ALL:ALL):表示可以以任何用户身份 (ALL) 在任何终端 (ALL) 上运行命令。
  4. 列4:NOPASSWD: 标志

    • 该列指定了是否需要输入密码才能使用 sudo 命令。
    • 如果列中包含 “NOPASSWD:”,则表示不需要密码。
    • 如果列为空或未包含 “NOPASSWD:”,则需要输入密码。
  5. 列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 组,可以按照以下步骤进行操作:

  1. 打开终端:在操作系统中打开终端或命令行界面。

  2. 使用 adduser 命令创建新用户:

    sudo adduser newuser
    

    这将提示你输入新用户的密码和其他详细信息。

  3. 将新用户添加到 sudo 组。可以使用 usermod 命令执行此操作:

    sudo usermod -aG sudo newuser
    

    这将将新用户 newuser 添加到 sudo 组中。

  4. 验证用户是否成功添加到 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 是一个允许普通用户在需要时以超级用户的身份执行特定的命令
  • adduseruseradd 都是在 Linux 系统上用于创建用户的命令,但 adduser 命令更方便友好,尤其适用于交互式的用户创建
  • getent 是一个命令行工具,用于从系统数据库(如密码、组、主机、服务等)中获取条目的信息

05-27 02:18