linux sudo 权限_在Linux中使用sudo委派权限

linux sudo 权限

我最近写了一个简短的Bash程序,将MP3文件从一个网络主机上的USB拇指驱动器复制到另一网络主机上。 这些文件被复制到我为志愿者组织运行的服务器上的特定目录中,从该目录可以下载和播放文件。

我的程序还执行其他一些操作,例如在复制文件之前更改文件名,以便在网页上按日期自动对文件进行排序。 在确认传输正确完成后,它还会删除USB驱动器上的所有文件。 这个不错的小程序有几个选项,例如-h显示帮助, -t显示测试模式,以及其他几个。

我的程序虽然很棒,但必须以root用户身份运行才能执行其主要功能。 不幸的是,这个组织只有几个人对管理我们的音频和计算机系统有兴趣,这使我处于寻找半技术人员的位置,并训练他们登录用于执行传输的计算机并运行此功能。程序。

做你做得很好的sudo

sudo程序是一个方便的工具,它使我作为sysadmin拥有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可以做更多的事情。 它可以允许sysadmin将管理网络功能或特定服务的权限委派给一个人或一组信任的用户。 它允许委派这些功能,同时保护root密码的安全性。

配置sudoers文件

作为系统管理员,我可以使用/etc/sudoers文件来允许用户或用户组访问单个命令,定义的命令组或所有命令。 这种灵活性是使用sudo进行委派的强大功能和简便性的关键。

一开始我发现sudoers文件非常混乱,因此下面我从使用它的主机上复制并解构了整个sudoers文件。 希望当您完成此分析时,它不会对您那么晦涩。 顺便说一句,我发现基于Red Hat的发行版中的默认配置文件往往带有大量注释和示例来提供指导,这使事情变得更容易,而所需的在线搜索也更少。

不要使用标准编辑器来修改sudoers文件。 使用visudo命令是因为它旨在在保存文件并退出编辑器后立即启用所有更改。 除了Vi之外,还可以使用与visudo相同的方式来使用编辑器。

让我们从几种别名开始分析此文件。

主机别名

主机别名部分用于创建主机组,在主机组上可以使用命令或命令别名提供访问权限。 基本思想是,将为组织中的所有主机维护此单个文件,并将其复制到每个主机的/etc中。 因此,可以将某些主机(例如服务器)配置为一个组,以使某些用户可以访问特定的命令,例如启动和停止HTTPD,DNS和联网等服务的功能; 挂载文件系统; 等等。

可以使用IP地址代替主机别名中的主机名。



   
   
## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the 'visudo' command.

## Host Aliases
## 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

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem
User_Alias AUDIO = dboth, ruser

## Command Aliases
## These are groups of related commands...

## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

## Services
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Delegating permissions
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

## Processes
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

#
# Refuse to run if unable to disable echo on the tty.
#
Defaults   ! visiblepw

Defaults    env_reset
Defaults    env_keep =   "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"


Defaults    secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root     ALL = ( ALL )       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
% wheel   ALL = ( ALL )       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

################################################################################
# Added by David Both, 11/04/2017 to provide limited access to myprog          #
################################################################################
#
AUDIO   guest1 = / usr / local / bin / myprog

带有粗体修改的默认sudoers文件。

用户别名

用户别名配置允许root用户将用户分类为别名组,以便整个组可以访问某些root功能。 这是我在其中添加了一行User_Alias AUDIO = dboth, ruser的部分,该行定义别名AUDIO并将两个用户分配给该别名。

如sudoers文件中所述,可以简单地使用/etc/groups文件中定义的/etc/groups而不是别名。 如果已经定义了一个满足您需要的组,例如“音频”,则使用该组名,并在其前加上一个%符号,如下所示:在分配以后将在sudoers文件中提供给组的命令时,请使用%audio

命令别名

sudoers文件中的最下方是命令别名部分。 这些别名是相关命令的列表,例如网络命令或安装更新或新RPM软件包所需的命令。 这些别名使sysadmin可以轻松地允许访问命令组。

本节中已经设置了许多别名,可以方便地将访问委派给特定类型的命令。

环境默认值

下一节将设置一些默认环境变量。 本节中最有趣的项是!visiblepw行,如果将用户环境设置为显示密码,该!visiblepw阻止sudo运行。 这是不应该被覆盖的安全预防措施。

命令部分

命令部分是sudoers文件的主要部分。 通过在此处添加足够的条目,可以在没有所有别名的情况下完成您需要做的所有事情。 别名使它变得更加容易。

本节使用您已经定义的别名来告诉sudo谁可以在哪些主机上执行操作。 一旦理解了本节中的语法,这些示例就是不言自明的。 让我们看一下在命令部分中找到的语法。


ruser           ALL = ( ALL ) ALL  

这表示ruser可以以任何用户的身份在任何主机上运行任何程序。

这是对我们的用户ruser的通用条目。 该行中的第一个ALL表示此规则适用于所有主机。 第二个ALL允许ruser以任何其他用户的身份运行命令。 默认情况下,命令以root用户身份运行,但是ruser可以在sudo命令行上指定以任何其他用户身份运行程序。 最后的ALL表示ruser可以不受限制地运行所有命令。 这将有效地使罗素扎根。

请注意,有一个root条目,如下所示。 这使root可以对所有主机上的所有命令具有全部访问权限。


root    ALL = ( ALL ) ALL  

这表示root可以以任何用户的身份在任何主机上运行任何程序。

为了尝试这一点,我注释掉了这一行,并以root身份尝试在不使用sudo的情况下运行chown 。 确实奏效了,这令我惊讶。 然后,我使用了sudo chown ,但失败了,并显示以下消息:“ Root不在sudoers文件中。将报告此事件。” 这意味着root可以以root身份运行所有内容,但是在使用sudo命令时则无能为力。 这样可以防止root用户通过sudo命令像其他用户一样运行命令,但是root用户可以通过多种方式来解决该限制。

下面的代码是我添加的用于控制对myprog的访问的代码。 它指定在sudoers文件顶部附近定义的AUDIO组中列出的用户只能访问一个主机guest1上的一个程序myprog。


AUDIO   guest1 = / usr / local / bin / myprog 

允许属于AUDIO组的用户访问主机guest1上的myprog。

请注意,以上各行的语法仅指定允许进行此访问的主机和程序。 它没有指定用户可以像其他任何用户一样运行该程序。

绕过密码

您也可以使用NOPASSWORD来允许AUDIO组中指定的用户运行myprog,而无需输入密码。 这是如何做:


AUDIO   guest1 =NOPASSWORD : / usr / local / bin / myprog 

允许属于AUDIO组的用户访问主机guest1上的myprog。

我没有在程序中执行此操作,因为我相信具有sudo访问权限的用户必须停止并思考他们在做什么,这可能会有所帮助。 我以我的小程序的条目为例。

如下所示,sudoers文件的命令部分中的wheel规范允许“ wheel”组中的所有用户在任何主机上运行所有命令。 wheel组在/etc/group文件中定义,并且必须将用户添加到该组中才能起作用。 组名前面的%符号表示sudo应该在/etc/group文件中查找该组。


% wheel          ALL = ( ALL ) ALL  

允许作为/etc/group wheel /etc/group文件中定义的“ wheel”组成员的所有用户可以在任何主机上运行所有命令。

这是将完全的root用户访问权限委派给多个用户的好方法,而无需提供root用户密码。 只需将用户添加到转轮组,即可使他们拥有完全的根本权限。 它还提供了一种通过sudo创建的日志条目监视其活动的方法。 某些发行版(例如Ubuntu)将用户的ID添加到/etc/group的wheel /etc/group ,这使他们可以将sudo命令用于所有特权命令。

最后的想法

我在这里使用sudo的目的非常有限-为一个或两个用户提供访问单个命令的权限。 我用两行代码(如果您忽略我自己的评论)完成了此操作。 将执行某些任务的权限委派给没有root用户访问权限的用户很简单,并且可以节省您作为sysadmin的大量时间。 它还会生成日志条目,以帮助检测问题。

sudoers文件提供了许多配置功能和选项。 检查man文件中的sudo和sudoers以获取详细信息。

翻译自: https://opensource.com/article/17/12/using-sudo-delegate

linux sudo 权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值