Sudo的用法和Visudo设置

Sudo的用法和Visudo设置,第1张

身为程序员,你可以活在一个没有Windows的世界,当你离不开Unix(Linux,Mac。。。)。而在Unix下面,你离不开terminal,离不开sudo。

你知道sudo command,然后输入密码,就可以以root的身份执行command。如果接触的更多一点,你或许知道sudo给你的权限不是自动给你的。如果你在一个Linux系统上增加了一个用户,你需要先以root的身份做一些设置,然后才能执行sudo命令。

这些设置,就是运行visudo,它会打开一个文件,然后我们在里面添加一些东西,这个过程很简单,因为这个文件的内容不多,而且有注释,而而且还有范例,你只需要copy一行,然后把“root”改成你想要添加的那个用户名就可以了。

然而,里面的东西其实看着很奇怪,我们要添加的那一行看起来大概是这样的:

`chris ALL=(ALL:ALL) ALL`

上面的内容取自Ubuntu 12.04,其他Unix平台内容也是类似的。其中“chris”是用户名,后面跟着好几个“ALL”,是干吗用的呢?

以前我一直都是实用主义,解决了一个问题,那就可以了,很少去想“为什么”,最近发现,如果如果一直是这样,其实不大好,知其然要知其所以然。当然,如果无穷无尽的去最求所以然,那就成了科学研究了,所以中间要有个度。

出于这个考虑,今天就看了一下这个visudo,看看究竟是什么东东。

前面说了,visudo其实是打开一个文件,让你编辑这个文件的内容,这个文件就是/etc/sudoers,用的编辑器默认是vi。你可以用任何编辑器打开编辑它。那么问题来了,为什么不用直接打开这个文件然后编辑其中的内容呢?根据visudo的使用说明,如果你用visudo来编辑这个文件,那么它会帮你自动做很多事情,比如说语法检查,加锁防止别人同时修改这个文件等等,所以,强烈建议用户使用visudo,强烈谴责用户直接修改这个文件。

下面,我们就运行这个命令,看看里面有什么东西:

以#开头的行都是注释,所以前面8行都是注释,第一行注释也说清楚了,这个文件必须用visudo来编辑。

第九行Default  env_reset 表示重置(就是去除)用户定义的环境变量,也就是说,当你用sudo执行一个命令的时候,你当前用户设置的所有环境变量都是无效的。比如说,你的home目录下面有一个bin文件夹,这个文件夹里面有一些可执行文件,你把这个文件夹加到Path环境变量里。正常情况下,你可以在任何地方直接执行这个文件夹里面的命令。但是你用sodu执行这个文件夹里面的命令时,shell会提醒你"command not found". 那是因为当你用sudo执行一个命令时,你当前用户设置的path环境变量已经失效了。

下面的

root  ALL=(ALL:ALL)  ALL

就是我们前面提到的ALL。在下面一行

zouchuang  ALL=(ALL:ALL) ALL

就是我们创建了一个新用户(在这里,这个新用户名字叫zouchuang),需要添加的这一行。

其中zouchuang是用户名,接下来的第一个ALL,表示"From ALL hosts"(所有主机), 意思是,zouchuang从任何机器登录,都可以应用接下来的规则。

第二个ALL,表示“run as All user”,这个的意思是,zouchuang可以以任何用户的身份运行一些命令。第三个ALL,表示“run as All groups”,它的意思是,zouchuang可以以任何用户组的身份运行一些命令。运行那些命令呢?这就是第四个ALL的意思了,这表示前面的规定适用于任何命令。总结起来,这四个ALL的含义就是,zouchuang这个用户可以从任何机器登录,以任何用户和用户组的身份运行任何命令。

这四个ALL都可以用其他值来代替,比如,可以将第一个ALL改成本地局域网,或某些特定的网段,这样的话,用户在其他机器上登陆以后,就无法使用sudo命令了。

第二个和第三个ALL是可选的,如果省略,则默认为root用户,也就是说,可以这样写:

zouchuang ALL= ALL,表示zouchuang可以从任何host登录,然后以root身份运行任何命令。

接下来下面这一行

%admin ALL=(All) ALL

表示这是用户组的权限,以%开头,admin是用户组的名字,接下来的几个ALL表示的含义跟前面所述的一样,其中第二个ALL表示“All users” 而不是“All groups”。

这就是这个sudoers文件中基本设置语句的含义,关于sudoers的用法太多了,这里先介绍到这里,希望以后能补上其他的一些。因为我发现写一篇文章所需要的时间太长了呜呜呜。。。

对于Linux管理者来说,“帐号管理”是再也普通不过的一个环节了,但每次都要去查一大本的手册实在是很浪费时间。我还是老老实实地花点心思把这些常用的功能都整理成一份文档,方便以后的使用和学习,以后也都会继续这样做下去。

本文的所有案例与说明都是基于Ubuntu 16.04.3 LTS 64位 *** 作系统,如果你的 *** 作系统与我的不一样,可能会出现不一样的结果。但Linux的原理都是通用的,善于使用man可以帮助你更好的管理你的 *** 作系统。

上图一共列出了9个相关文件,但这里我只重点讲解前三个文件,也即是 /etc/passwd、/etc/shadow 与 /etc/group。

1、/etc/passwd

User account information. --(明文的)用户账号信息

这个文件每一行都代表一个帐号,有几行就代表有几个帐号在你的系统中!不过需要特别注意的是,里面很多帐号本来就是系统正常运行所必须的,我们可以简称它为系统帐号。这些帐号都是你不能随便删除的!

通过查看passwd(5)手册可以查看/etc/passwd的文件结构:

文件结构说明:

“/etc/passwd” 第二项的内容说明

2、/etc/shadow

Secure user account information. -- 安全加密的用户账号信息

通过查看shadow(5)手册也可以查看/etc/shadow的文件结构:

如shadow(5)中所述,这个文件中被 “:” 分隔的每项含义如下。

3、/etc/group

Group account information.  -- 组信息

通过查看group(5)手册也可以查看/etc/group的文件结构:

如group(5)中所述,这个文件中被“:”分隔的每项含义如下。

注意:

“/etc/gshadow” 为 “/etc/group” 提供了与 “/etc/shadow” 相似的功能,但没有被真正地使用。

4、/etc/gshadow

Secure group account information. -- 安全加密的组信息

5、/etc/default/useradd

Default values for account creation.  -- 创建用户时的默认设置

6、/etc/skel/

Directory containing default files.  -- 用户主目录的默认内容

7、/etc/subgid

Per user subordinate group IDs.

8、/etc/subuid

Per user subordinate user IDs.

9、/etc/login.defs

Shadow password suite configuration.

1、添加用户 -- useradd

useradd -- create a new user or update default new user information.

常用参数:

例1:最简单的例子

例2:创建一个可以使用的帐号

例3:查看useradd默认设置

使用useradd创建用户时还会参考文件/etc/login.defs的设置,比如UID/GID的指定数值、用户主文件夹设置值、用户删除与密码设置值等,这里也不做深入讨论了。

2、用户密码管理 -- passwd

passwd - change user password

常用参数:

3、用户密码管理 -- chage

chage - change user password expiry information

4、用户信息修改 -- usermod

usermod - modify a user account

当然,以上的修改你也可以通过手动修改相关的配置文件来达到一样的目的。

5、删除用户 -- userdel 

userdel - delete a user account and related files

注意:

1)一般而言,该帐号如果只是暂时不启用的话,那么将/etc/shadow里面帐号失效日期(第八字段)设置为0就可以让该帐号无法登录,但所有相关的数据都会留下来。使用userdel的时候通常是你真的确定不要该用户在主机上面用任何数据了!

2)如果想要完整地将某个帐号删除,最好可以执行userdel -r username之前,先以“find / -user username”查出整个系统内属于username的文件,然后再进行删除。

1、初始用户组(initial group)与 有效用户组(effective group):

在/etc/passwd里面的第四列有一个所谓的GID,它就是“ 初始用户组 ”。也就是说,当用户登录系统,立刻就拥有这个用户组的相关权限的意思。

有效用户组:即帐号当前(实时)所使用的用户组。

次要用户组:次要用户组就是除了用户的初始用户组外的其它所属组,在/etc/group的最后一个字段中所设置,可以有多个(多个用逗号','隔开)。

使用usermod -g可以修改初始用户组,而使用usermod -G则可以修改次要用户组。

例1:修改用户次要用户组

例2:有效与支持用户组的查看

在这个输出的信息中,可知道nosee这个用户同时属于nosee及users这两个组,而且,第一个输出的即为“ 有效用户组 ”。也就是说,上面例子中的有效用户组为nosee。

2、有效用户组的切换 -- newgrp

上面例子中,nosee的有效用户组从nosee转变成了users。

现在我们来深入讨论下newgrp这个命令,这个命令可以更改目前用户的有效用户组,而且是另外以一个新的shell来提供这个功能。因此如果你想要回到原本的环境中,只需要输入exit即可。

3、新增用户组 -- groupadd

groupadd - create a new group

常用参数:

4、用户组参数修改 -- groupmod

groupmod - modify a group definition on the system

常用参数:

注意:不要随意改动GID,容易造成系统资源的错乱。

5、删除用户组 -- groupdel

groupdel - delete a group

注意,只有在/etc/passwd内没有任何用户使用该用户组的作为初始用户组的时候,才可以成功删除。

6、用户组管理员功能 -- gpasswd

gpasswd - administer /etc/group and /etc/gshadow

1)系统管理员(root)的常用参数

2)用户组管理员(Group administrators)的常用参数

1、su

su - change user ID or become superuser

su是最简单的身份切换命令了,它可以进行任何身份的切换。

常用参数:

注意:

1)这个su的用法当中,有没有加上“-”差很多的,转为涉及login-shell与not-login shell的变量读取方法。即想要完整的切换到新用户的环境,可以利用“su - username”或“su -l username”。

2)使用root切换到任何用户时,都不需要输入密码

3)当从其它用户切换到root用户时都必须输入root的密码,这样root的密码就很容易流传出去,这是很不妥当的,所以才会有sudo这个命令的出现。

2、sudo

sudo, sudoedit — execute a command as another user

sudo的执行仅需要自己的密码,甚至可以设置不需要密码即可执行sudo。由于sudo可以让你以其他的用户身份执行命令(通常是root的身份),因此并不是所有人才能执行sudo,而是仅有/etc/sudoers内的用户才能够执行sodu这个命令。

/etc/sudoers文件内容如下:

常用参数:

例:使用nosee的身份在/home/nosee/目录下新建一个test文件

sudo的执行流程:

1)当用户执行sudo时,系统于/etc/sudoers文件查找该用户是否有执行sudo的权限;

2)若用户具有可执行sudo的权限后,便让用户输入自己的密码来确认;

3)若密码输入成功,便开始进行sudo后续接的命令(但root执行sudo时不需要输入密码);

4)若欲切换的用户与执行者身份相同,那也不需要输入密码。

因为/etc/sudoers文件有一定的规则,所以我们一帮不直接用vi去编辑。一般,我们都是使用visudo来修改这个文件。

3、visudo

因为/etc/sudoers是有语法的,如果设置错误那会造成无法使用sudo的不良后果,因此才会使用visudo去修改。

一般来说,visudo的设置方式有几种简单的方法,正面我们以几个简单的例子来说明:

1)单一用户可以进行root的所有命令与sudoer文件语法

例:让用户nosee可以使用root的所有命令

2)利用用户组及免密功能处理visudo

例:让nosee用户组可以使用root的所有命令,并且不需要输入密码

注意:用户组的表示只需要在前面加一个百分号%即可,NOPASSWD则是免密的关键字。

3)有限制的命令 *** 作

例:让user1用户仅能使用passwd这个命令帮root修改其他用户的密码

注意:最后一个参数一定要用绝对路径才行,否则visudo会出现语法错误。

但这里有个可怕的地方,就是用户user1竟然也可以去修改root的密码了,这是不应该允许发生的,为了避免上述的问题,应该使用下面的这种配置:

上面参数的意思是,用户user1可以执行“passwd 任意字符串”,但是“passwd”与“passwd root”两个命令除外。

4)通过别名设置visudo

5)sudo的时间间隔问题

两次执行sudo的间隔时间在5分钟内,那么再次执行sudo时就不需要再次输入密码。

6)sudo搭配su的使用方式

很多时候我们需要大量执行很多root的工作,所以一直sudo觉得麻烦。这里有一个变身root用户的办法,而且还不会外泄root密码,前提是你要非常信任你将要为他们做此次设置的用户。

1、查看用户当前所用的shell

1)实时查看当前进程中使用的shell种类:推荐

2)最常用的查看shell的命令,但不能实时反映当前shell

3)环境变量中shell的匹配查找

4)口令文件中shell的匹配查找

2、强制踢出已登录用户

或也可以给他发送一条信息。

3、adduser

adduser也可以用于用户的添加,感觉兴趣的同学可以自行去查阅相关的资料。

1、《鸟哥的Linux私房菜基础学习篇》-- 鸟哥

2、  Debian官方参考手册

如发现有写得不对或不好的地方非常欢迎到评论区指出与交流,感谢阅读!    

——《完》


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8060087.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存