Linux sudoers文件的写法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

文件的组成

      sudoers文件由三部分组成:

  • sudoers的默认配置,主要设置sudo的一些缺省值(本文不会对这些默认配置进行介绍,若有兴趣可以自己man 5 sudoers然后搜defaults)
  • alias(别名),可以看作是变量的定义啦,本文也会全面的说说别名的定义。
  • 规则定义,sudoers文件的重点啦,本文会着重说明规则的定义。

Alias(别名)

一共有四种类型的别名,这些类型可以看作它们是数据类型啦哈。

  • User_Alias
  • Runas_Alias
  • Host_Alias
  • Cmnd_Alias

那么要如何定义这些Alias呢?语法如下:

User_Alias NAME=User_ListRunas_Alias NAME=Runas_ListHost_Alias NAME=Host_ListCmnd_Alias NAME=Cmnd_List

 

这里的NAME就可以看作是变量名咯。注意,NAME必须是要以大写字母开头,而且只能包含有大写字母,数字,下划线呢。那么User_List,Runas_List,Host_List,Cmnd_List又是什么呢?其实就是以“,"分隔的一个数组啦,只不过这四个别名表示的数组内容都会不同啦。

 

现在分别看看User_List,Runas_List,Host_List,Cmnd_List的每个数组元素可以是些什么值吧!

User:[!][username |#uid |%groupname | +netgroup |%:nonunix_group | User_Alias]Runas:[!][username|#uid | %groupname | +netgroup |Runas_Alias]Host:[!][hostname | ip_addr | network(/netmask)? |  netgroup | Host_Alias]Cmnd:[!][commandname| directory| "sudoedit" | Cmnd_Alias]

 

看看上面的元素名就可以知道大概什么意思了吧?这里着重拿些可能有疑问的出来说说。

叹号'!'表示取反的意思啦。

每个元素都可以是之前定义过的别名变量啦,所以会有User_List,Runas_List,Host_List,Cmnd_List这些元素啦。

directory表示有可以进入该目录并执行命令的权限啦

"sudoedit"表示允许用户使用sudo -e选项。

 

如果还没搞懂的话,可以看下面的别名定义的例子:

User_Alias USER_TEST=tim,#501,%svn,+webgroup,%:nonunix,!nouserRunas_Alias RUNAS_TEST=tim,#501,%svn,!+webgroupHost_Alias HOST_TEST=!www.baidu.com,localhost,127.0.0.1Cmnd_Alias CMND_TEST=Cmnd_Alias CMDS=/bin/passwd,/bin/ls,/home/svn

User Specification(用户规则)

用户规则定义的语法如下:

User_List Host_List=(Runas_List1:Runas_List2) SELinux_Spec Tag_Spec Cmnd_List,...

下面对上面的语法进行说明一下:

User_List(必填项):指的是该规则是针对哪些用户的。

Host_List(必填项):指的是该规则针对来自哪些主机的用户。

Runas_List1(可选项):表示可以用sudo -u来切换的用户

Runas_List2(可选项):表示可以用sudo -g来切换的用户组

SELinux_Spec(可选项):表示SELinux相关的选项,可选值为ROLE=role 或 TYPE=type。本人对SELinux不太熟,以后再补充这里吧。

Tag_Spec(可选项):用于控制后面Cmnd_List的一些选项啦,可选值有下面这些,具体自己man一下吧,这里就不啰嗦了。

'NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' | 'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:'

...(可选项):表示可以有多个(Runas_List1:Runas_List2) SELinux_Spec Tag_Spec Cmnd_List段的意思了。

Notice:如果Runas_List1和Runas_List2都没填的话,默认是以root用户执行

如果不是很理解的话,可以对比着文章后面举的例子来看下,应该难不倒聪明的我们!

 

sudoers文件下的通配符

通配符只可以用在主机名、文件路径、命令行的参数列表中。下面是可用的通配符:

*:匹配任意数量的字符

?:匹配一个任意字符

[...]:匹配在范围内的一个字符

[!...]:匹配不在范围内的一个字符

\x:用于转义特殊字符

在使用通配符时有以下的注意点:

1.使用[:alpha:]等通配符时,要转义冒号':',如:[\:alpha\:]

2.当通配符用于文件路径时,不能跨'/'匹配,如:/usr/bin/*能匹配/usr/bin/who但不能匹配/usr/bin/X11/xterm

3.如果指令的参数列表是""时,匹配不包含任何参数的指令。

4.ALL这个关键字表示匹配所有情况。

 

man sudoers下的例子解析

       

 # 用户别名定义User_Alias     FULLTIMERS = millert, mikef, dowdyUser_Alias     PARTTIMERS = bostley, jwfox, crawlUser_Alias     WEBMASTERS = will, wendy, wim#用户切换别名定义Runas_Alias    OP = root, operatorRunas_Alias    DB = oracle, sybaseRunas_Alias    ADMINGRP = adm, oper#主机别名定义Host_Alias     SPARC = bigtime, eclipse, moet, anchor :\SGI = grolsch, dandelion, black :\ALPHA = widget, thalamus, foobar :\HPPA = boa, nag, PythonHost_Alias     CUNETS = 128.138.0.0/255.255.0.0Host_Alias     CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0Host_Alias     SERVERS = master, mail, www, nsHost_Alias     CDROM = orion, perseus, hercules#指令别名定义Cmnd_Alias     DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\/usr/sbin/restore, /usr/sbin/rrestoreCmnd_Alias     KILL = /usr/bin/killCmnd_Alias     PRINTING = /usr/sbin/lpc, /usr/bin/lprmCmnd_Alias     SHUTDOWN = /usr/sbin/shutdownCmnd_Alias     HALT = /usr/sbin/haltCmnd_Alias     REBOOT = /usr/sbin/rebootCmnd_Alias     SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \/usr/local/bin/tcsh, /usr/bin/rsh, \/usr/local/bin/zshCmnd_Alias     SU = /usr/bin/suCmnd_Alias     PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less



#开始定义规则

#root用户及wheel用户组下的所有用户都可以从任何主机连接进来以任意身份执行任意命令

root           ALL = (ALL) ALL
%wheel         ALL = (ALL) ALL


#FULLTIMERS这个用户别名中定义的用户可以从任何主机连接进来以任意身份执行任意命令,而且在切换用户或用户组时不需要输入密码

 FULLTIMERS     ALL = NOPASSWD: ALL


#PARTTIMERS这个用户别名中定义的用户可以从任何主机连接进来以root身份执行任意命令。

PARTTIMERS     ALL = ALL


#The user jack may run any command on the machines in the CSNETS alias (the networks 128.138.243.0, 128.138.204.0, and 128.138.242.0).  Of those
       #networks, only 128.138.204.0 has an explicit netmask (in CIDR notation) indicating it is a class C network.  For the other networks in CSNETS,
      # the local machine’s netmask will be used during matching.
   

jack           CSNETS = ALL

#lisa这个用户可以从CUNETS中定义的主机连接进来以root身份执行任意指令。

 lisa           CUNETS = ALL


#oprator这个用户可以从任何主机连接进来以root身份执行DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,sudoedit /etc/printcap, /usr/oper/bin/定义的指令
       

 operator       ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\sudoedit /etc/printcap, /usr/oper/bin/


#joe这个用户可以从任何主机连接进来,并且只能执行su operator指令

joe            ALL = /usr/bin/su operator

#pete这个用户可以从HPPA定义的主机中连接进来并以root身份执行passwd的所有命令,除了passwd root

pete           HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

       
#opers这个用户组下的所有用户可以从任何主机连接进来,并可以切换至ADMINGRP中定义的用户组进入/usr/sbin并执行命令

 %opers         ALL = (: ADMINGRP) /usr/sbin


#bob这个用户可以从SPARC和SGI中定义的主机连接进来,并可以OP定义的用户执行任意指令 

 bob            SPARC = (OP) ALL : SGI = (OP) ALL


#jim这个用户可以从biglab这个netgroup中连接进来,并执行任意指令

jim            +biglab = ALL


#secretaries这个netgroup下的所有用户可以从任意主机连接进来,并以root身份执行PRINTING,/usr/bin/adduser, /usr/bin/rmuser中定义的指令
       

 %secretaries   ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser

#fred这个用户可以从任何主机连接进来并以DB别名定义的用户来执行所有指令,并且不需要输入密码

fred           ALL = (DB) NOPASSWD: ALL

#john这个用户可以从ALPHA定义的主机中连接进来,并可以以root身份执行su指令,但不能执行su root和使用任何su选项
   

john           ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

 #jen这个用户可以从任何主机(除了SERVERS中定义的主机)连接进来,并以root身份执行任意指令

#jill这个用户可以从SERVERS定义的主机连接进来,并以root身份进入/usr/bin/执行指令,但不能执行SU和SHELLS中定义的命令

jill           SERVERS = /usr/bin/, !SU, !SHELLS

#steve这个用户可以从CSNETS中定义的主机连接进来,并以operator这个用户可以进入/usr/local/op_commands/执行指令

 steve          CSNETS = (operator) /usr/local/op_commands/

       

 

转载于:https://my.oschina.net/ososchina/blog/867400

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

if是什么c语言,这个C语言是什么(if(1))?

我在openssl源代码中注意到一个奇怪的成语,here并重复如下:if ((in NULL) && (passwds NULL)) {if (1) { (* #ifndef OPENSSL_NO_UI/* build a null-terminated list */static char *passwds_static[2] { NULL, NULL };passwds passwds_static;if (in …

c#queue_带有C#示例的Queue.CopyTo()方法

c#queueC#Queue.CopyTo()方法 (C# Queue.CopyTo() method) Queue.CopyTo() method is used to copy the Queue elements/objects to an existing array from specified index. Queue.CopyTo()方法用于将Queue元素/对象从指定的索引复制到现有数组。 Syntax: 句法&a…

指针在c语言中的运用,怎么理解C语言中的指针,如何运用?

恰好我之前写了一系列介绍 C 语言的文章,介绍了什么是指针,以及为什么要使用指针,下面摘录一部分,感兴趣的话,可以点我了解更多。什么是 C语言指针?不同的数据类型的主要区别在于占用的存储空间不同。我们知…

设计模式(一)单例模式的七种写法

1. 饿汉模式 public class Singleton { private static Singleton instance new Singleton(); private Singleton (){}public static Singleton getInstance() { return instance; } } View Code这种方式在类加载时就完成了初始化,所以类加载较慢,…

scala 字符串转换数组_如何在Scala中将字节数组转换为字符串?

scala 字符串转换数组Byte Array in Scala is an array of elements of a byte type. String in Scala is a collection of the character data type. Scala中的字节数组是字节类型的元素的数组。 Scala中的String是字符数据类型的集合。 将字节数组转换为字符串 (Convert byt…

智能关机软件 c语言,智能关机软件

智能关机软件是一款免费共享关机软件。智能关机软件不但具有定时关机、自动关机的功能,而且还可以进行定时提醒信息、打开文件、打开网页、重启计算机、注销用户、锁定计算机、计算机休眠、计算机待机、关闭显示器,并且可以进行多任务计划,可…

wget: command not found

-bash: wget: command not found的两种解决方法 今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包。一般linux最小化安装时,wget不会默认被安装。可以通过以下两种方法来安装:1、rpm 安装rp…

数据库数据规范化看不懂_数据库管理系统中的规范化

数据库数据规范化看不懂DBMS中的规范化 (Normalization in DBMS) Every table must have a single idea. The method by which we divide tables approximately is called normalization and the rest used for normalization is a functional dependency. For the normalizati…

c 语言开发一个四则运算器,C++实现四则运算器(无括号)

本文实例为大家分享了C实现无括号的四则运算器的具体代码,供大家参考,具体内容如下完成度更高的带括号版本可以看C实现四则运算器(带括号)对于无括号的计算器,实现起来比较容易,下面让我们一步步实现。举例首先明确需要实现怎样的…

iOS开发之解决系统数字键盘无文字时delete键无法监听的技巧

最近在做用户登录获取验证码时添加图形验证码功能,就是只有正确输入图形验证码才能收到后台发送的短信验证码。效果如下: 看起来虽然是个小功能,但是实际操作起来,会发现苹果给我们留下的坑,当然更多的是自己给自己挖的…

c ++查找字符串_C ++结构| 查找输出程序| 套装1

c 查找字符串Program 1: 程序1&#xff1a; #include <iostream>#include <math.h>using namespace std;struct st {int A NULL;int B abs(EOF EOF);} S;int main(){cout << S.A << " " << S.B;return 0;}Output: 输出&#xff1a…

二级c语言加油,二级C语言 备考指南及常见问题(2013版)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼3、关于上机操作部分的复习最好买一本上机题库方面的教材&#xff0c;或打印、阅读南开百题之类的电子文档。配合上机模拟软件(无纸化考试软件)&#xff0c;上机练习是必须的。上机软件一般有100套题多一点&#xff0c;每套有程序填…

开放定址散列表

再散列之后散列函数要重新计算。 // kaifangliaobiao.cpp : 定义控制台应用程序的入口点。 //使用平方探测解决冲突问题时&#xff0c;散列表至少空一半时&#xff0c;总能插入一个新的元素#include "stdafx.h" #include<iostream> using namespace std;#ifnde…

合并两个链表数据结构c语言,合并两个链表.

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #define N1 10#define N2 10struct list{int date ;struct list *next;};main(){struct list *p1,*p2,*p3,*p4,*head,*head1,*head2,*p;int n0;head1head2NULL;p1p2(struct list *)malloc(sizeof(struct list));p1->da…

c ++查找字符串_C ++结构| 查找输出程序| 套装2

c 查找字符串Program 1: 程序1&#xff1a; #include <iostream>using namespace std;int main(){typedef struct{int A;char* STR;} S;S ob { 10, "india" };S* ptr;ptr &ob;cout << ptr->A << " " << ptr->STR[2];…

连接fiddler后手机无法显示无网络

升级了fiddler到4.6版本&#xff0c;手机设置代理后提示无网络&#xff0c;试试以下解决方法&#xff1a; 1.fiddler升级后对应的.net framework也要升级&#xff0c;安装最新的.net framework 4.6&#xff0c;升级安装后&#xff0c;可以正确抓包啦 2.如果上述方法无效&#x…

android 人脸解锁 锁屏动画,人脸保护锁(人脸识别锁屏)

这是一款十分炫酷的锁屏工具&#xff0c;还记得电影中的特工所用的人脸识别锁吗&#xff1f;这款应用也能让你过过瘾&#xff01;人脸识别锁屏安卓版是一款用人脸做密码来打开手机屏保锁的一个APP。不仅可以作屏保锁&#xff0c;也可以单独保护某些重要程序不被偷窥,例如查看短…

dbms_排名前50位的DBMS面试问答

dbms1) What are the drawbacks of the file system which is overcome on the database management system? 1)在数据库管理系统上克服的文件系统有哪些缺点&#xff1f; Ans: Data redundancy & isolation, difficulty in accessing data, data isolation, and integri…

linux时间

CST代表中国标准时间rtc实时时钟linux主要有两种时间硬件时钟 clock系统时钟 date修改时间 date 03300924必须是两位或者 date -s 2017:03:30将系统时间同步到硬件时间 hwclock -w将硬件时间同步到系统时间 hwclock -s转载于:https://blog.51cto.com/12372297/1911608

查找Python中给定字符串的所有排列

Python itertools Module Python itertools模块 "itertools" are an inbuilt module in Python which is a collection of tools for handling iterators. It is the most useful module of Python. Here, a string is provided by the user and we have to print a…