Linux进阶 把用户加入和移除用户组
1、Linux 单用户多任务,多用户多任务概念
Linux 是一个多用户、多任务的操作系统。
单用户多任务、多用户多任务 概念;
- Linux 的 单用户、多任务
以 beinan 登录系统,进入系统后,我要打开gedit 来写文档,但在写文档的过程中,我感觉少点音乐,所以又打开xmms 来点音乐;当然听点音乐还不行,MSN 还得打开,想知道几个弟兄现在正在做什么,这样一样,我在用beinan 用户登录时,执行了gedit 、xmms以及msn等,当然还有输入法fcitx ;这样说来就有点简单了,一个beinan用户,为了完成工作,执行了几个任务;
- Linux 的 多用户、多任务
上面除了 beinan 这个用户,可能还有其它的用户远程登录过来,也能做其它的工作。这就是多用户,很多用户同时用同一个系统,但并不所有的用户都一定都要做同一件事,所以这就有多用户多任务之说;比如:在服务器上面有 FTP 用户、系统管理员、web 用户、常规普通用户等,在同一时刻,可能有的弟兄正在访问论坛;有的可能在上传软件包管理子站,比如luma 或Yuking 兄在管理他们的主页系统和FTP ;在与此同时,可能还会有系统管理员在维护系统;浏览主页的用的是nobody 用户,大家都用同一个,而上传软件包用的是FTP用户;管理员的对系统的维护或查看,可能用的是普通帐号或超级权限root帐号;
不同用户所具有的权限也不同,要完成不同的任务得需要不同的用户,也可以说不同的用户,可能完成的工作也不一样;
用户的角色区分:用户在系统中是分角色的,在 Linux 系统中,由于角色不同,权限和所完成的任务也不同;用户的角色是通过 UID 和识别的,特别是UID;在系统管理中,系统管理员一定要坚守UID 唯一的特性;
- root 用户:系统唯一,是真实的,可以登录系统,可以操作系统任何文件和命令,拥有最高权限;
- 虚拟用户:这类用户也被称之为伪用户或假用户,与真实用户区分开来,这类用户不具有登录系统的能力,但却是系统运行不可缺少的用户,比如 bin、daemon、adm、ftp、mail 等;这类用户都系统自身拥有的,而非后来添加的,当然我们也可以添加虚拟用户;
- 普通真实用户:这类用户能登录系统,但只能操作自己家目录的内容;权限有限;这类用户都是系统管理员自行添加的;
多用户操作系统的安全
多用户系统对系统管理更为方便、更为安全。比如 beinan 用户下的某个文件不想让其它用户看到,只是设置一下文件的权限,只有beinan一个用户可读可写可编辑就行了,这样一来只有beinan一个用户可以对其私有文件进行操作,Linux 在多用户下表现最佳,Linux 能很好的保护每个用户的安全,从服务器角度来说,多用户的下的系统安全性也是最为重要的,常用的 Windows 操作系统在系纺权限管理方面根本没法和 Linux 或 Unix 类系统相比。
用户 (user)和 用户组(group)概念
- 用户 ( user )
Linux 是多用户操作系统,所以可以在 Linux 系统中建若干用户(user)。比如:我们的同事想用我的计算机,但我不想让他用我的用户名登录,因为我的用户名下有不想让别人看到的资料和信息(也就是隐私内容)这时我就可以给他建一个新的用户名,让他用我所开的用户名去折腾,这从计算机安全角度来说是符合操作规则的;
当然用户(user)的概念理解还不仅仅于此,在 Linux 系统中还有一些用户是用来完成特定任务的,比如 nobody 和 ftp 等,我们访问 LinuxSir.Org 的网页程序,就是 nobody 用户;我们匿名访问 ftp 时,会用到用户 ftp 或 nobody ;
如果您想了解 Linux 系统的一些帐号,请查看文件:/etc/passwd
- 用户组 ( group )
用户组(group)就是具有相同特征的用户(user)的集合体;比如:有时要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时就需要用户组,把用户都定义到同一用户组,通过修改文件或目录的权限,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限。
用户
和用户组
的对应关系
-
一对一
:某个用户可以是某个组的唯一成员; -
多对一
:多个用户可以是某个唯一的组的成员,不归属其它用户组;比如beinan和linuxsir两个用户只归属于beinan用户组; -
一对多
:某个用户可以是多个用户组的成员;比如beinan可以是root组成员,也可以是linuxsir用户组成员,还可以是adm用户组成员; -
多对多
:多个用户对应多个用户组,并且几个用户可以是归属相同的组;其实多对多的关系是前面三条的扩展;理解了上面的三条,这条也能理解;
实际用户
和有效用户
区别
Unix系统通过进程的有效用户ID和有效用户组ID来决定进程对系统资源的访问权限。
Unix高级编程第八章提到实际用户和有效用户,那么这两个用户到底是什么,它们之间有什么区别呢?
-
实际用户ID( 实际组ID ):标识当前用户(所属组)是谁,当用户登陆时取自口令文件。即标识我是谁。也就是登录用户的 uid 和 gid。比如我的Linux以king用户登录,在Linux运行的所有的命令的实际用户ID都是king的uid,实际用户组ID都是king的gid(可以用id命令查看)
-
有效用户ID( 有效组ID ):用来决定我们(当前进程)对资源的访问权限或者对文件的访问权(即实际该进程是以那个用户运行的)
一般情况下,有效用户 ID 等于实际用户ID,有效用户组ID等于实际用户组ID。当设置-用户-ID(SUID)位设置,则有效用户ID等于文件的所有者的uid,而不是实际用户ID;同样,如果设置了设置-用户组-ID(SGID)位,则有效用户组ID等于文件所有者的gid,而不是实际用户组ID。
一个测试验证程序
这个程序非常简单没有什么好说的。编译这个程序生成 test 程序
通过 id 命令看到当前登录用户为 root,uid=0,gid=0。通过 ls 命令可以看出 test 程序没有设置SUID 和 SGID,所有者是 root,所有组也是 root。
执行 test 发现有效用户ID等于实际用户ID(0),有效用户组ID等于实际用户组ID(0)。
你可能注意到 test 的所有者root,组也是 root,和实际用户,实际用户组是一样的。
下一步我们修改一下test所有者和组,再看结果。
发现结果和上面一样,test 进程的有效用户ID等于实际用户ID(0),有效用户组ID等于实际用户组ID(0)。下面给 test 程序设置 SUID
发现设置 test 程序的 SUID 位之后,test 进程的有效用户ID等于文件所有者的 UID( gkh的uid为500),有效用户组ID还是等于实际用户组ID(0)。这样程序就可以访问只有 gkh 才能访问的资源了
- linux 特殊权限 SUID、SGID、SBIT
先看看下面两个的权限是什么
- SUID 权限
当 s 出现在 “文件拥有者的 x 权限
” 上时,如上面看到的 /usr/bin/passwd 这个文件的权限是 -rwsr-xr-x,此时就被称为 SET UID 简称 SUID。
SUID 对于一个文件有什么限制和功能呢?
1. SUID权限仅对二进制可执行文件有效
2. 执行者对于该文件具有x的权限
3. 本权限仅在执行该文件的过程中有效
4. 执行者将具有该文件拥有者的权限
例如:普通用户用 passwd 修改自己的密码命令,实际上最终更改的是 /etc/passwd 文件。此文件时用户管理配置文件,只有 root 权限才能更改
既然是 root 用户才拥有此权限,为什么我们可以通过 passwd 命令来修改密码呢,那这就要归功于 passwd 设置了 suid 权限位了
此时普通用户通过执行 passwd 命令,临时拥有 root 权限,间接的修改 /etc/passwd,以达到修改自己密码的权限
- SGID 权限
当 s 出现在 " 目录或文件所属群的x权限 " 上时,此时就称为 SET GID,简称 SGID。
那 SGID 对文件和目录分部有哪些功能呢?
SGID 对 目录:
1. 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录
2. 使用者在此目录下的群组将会变成该目录的群组
3. 若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同
SGID 对 文件:
1. SGID 对二进制可执行文件有效
2. 程序执行者对于该文件来说,需具备 x 的权限
3. 执行者在执行的过程中,将会获得该文件群组的支援(用于改文件群组的权限)
SBIT 权限:
当 s 出现在目录其他用户的x权限上时,此时就称为 Sticky Bit 简称SBIT。
那 SBIT 有哪些限制和作用呢?
1. 仅对目录有效,对文件无效
2. 当使用者在该目录下建立文件或目录时(有权限的情况下),仅自己与 root 才有权力删除新建的目录或文件
我们知道 /tmp 目录是这样的权限。
现在我们来验证下,先用 root 账号在 tmp 文件中创建一个文件 test,然后用 openstack (其他账号) 进入该目录,删除 test 文件,看看发生什么情况
我们看到这样是不能删除文件的。因为 /temp 目录有 SBIT 权限
设置 SUID、SGID、SBIT
方法 1:符号类型改变权限(文字法:SUID: u+s ,SGID: g+s,SBIT: o+t )
chmod u+s testbin // 为testbin文件加上 setuid 标志.
chmod g+s testdir // 为testdir目录加上 setgid 标志
chmod o+t testdir // 为testdir目录加上 sticky 标志
方法 2:数字类型改变档案权限
数字法:将原来的三位数扩展为四位数即可,SUID为4,SGID为2,SBIT为1,把它们放在权限数字的最开头。
例如:设置 SUID 可以写成4777,设置 SGID 可以写成,2777setuid 位, 如果该位为1, 则表示设置 setuid 4755setgid 位, 如果该位为1, 则表示设置 setgid 2755sticky 位, 如果该位为1, 则表示设置 sticky 1755设置完这些标志后,可以用 ls -l 来查看。
rwsrw-r-- 表示有 setuid 标志
rwxrwsrw- 表示有 setgid 标志
rwxrw-rwt 表示有 sticky 标志
管理用户(user)和用户组(group)相关命令
su、su -、sudo、visudo、sudoedit
su :切换用户(su 和 su - 这两个切换用户命令是有区别的。)
-
su :是用来切换用户,只输入su 后面不加账户名称时,系统默认切换到 root 账户。仅仅只是切换 root 身份,但 Shell 环境仍然是普通用户的 Shell。执行 pwd 命令发现工作目录仍然是普通用户的工作目录
-
su - :申请切换到 root 用户,需要 root 用户密码。用户 和 Shell 环境一起切换成 root 身份。执行 pwd 命令可以发现工作目录变成 root 的工作目录。要从当前用户切换到其它用户,推荐使用 su - 命令,这样连 shell 环境也切换了。有些 Linu x发行版默认没有设置 root 用户的密码,需要先使用 sudo passwd root 设置 root 用户密码。示例:su - root 或者 su -
-
echo $PATH 命令看一下 su 和 su - 环境变量也不一样。
什么是 Sudo
sudo (superuser do) 命令是一个命令行程序,它允许用户以 root 用户身份执行命令,而不需要知道 root 的密码,并能把输入输出写入日志 ( /var/log/auth.log 文件记录了执行的所有命令和参数 )。sudo 也是一种权限管理机制,它允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。默认的安全策略记录在/etc/sudoers 文件中,而安全策略可能需要用户通过密码来验证他们自己。也就是在用户执行 sudo 命令时要求用户输入自己账号的密码。如果验证失败,sudo 命令将会退出。
虽然有点类似于 su 命令,但 sudo 的不同之处在于它默认需要用户的密码进行身份验证,而不是 su 需要的目标用户的密码。sudo 也不会产生 root shell;相反,它以提升的权限运行程序或命令,不像 su,它产生一个 root shell。
使用 sudo,系统管理员可以执行以下操作:
- 授予用户或用户组以提升或 root 权限运行某些命令的能力。
- 查看每个使用 sudo 的用户的用户 ID 的日志。
- 控制用户可以在主机系统上使用什么命令。
sudo 程序相关文件
/etc/sudoers 用于控制访问权限和密码提示超时
/etc/init.d/sudo
/etc/pam.d/sudo
/var/lib/sudo
/usr/share/doc/sudo
/usr/share/lintian/overrides/sudo
/usr/share/bash-completion/completions/sudo
/usr/bin/sudo
/usr/lib/sudo
系统默认创建了一个名为 sudo 的组。只要把用户加入这个组,用户就具有了 sudo 的权限。至于如何把用户加入 sudo 组,您可以直接编辑 /etc/group 文件,当然您得使用一个有 sudo 权限的用户来干这件事:先创建用户并设置密码后,然后在sudo组中加入该用户,多个用户用逗号隔开。
添加内容如下:
把用户 testuser 添加到了 sudo 组中,所以当用户 testuser 登录后就可以通过 sudo 命令以 root 权限执行命令了!但是,用 testuser 执行 root 权限的命令时会报错,还需要修改文件,解决办法:
1)、切换到 root 用户下普通用户切换到root用户下:sudo -iroot用户切换到普通用户下:su testuser
2)、添加sudo文件的写权限,命令是:chmod u+w /etc/sudoers
3)、编辑 sudoers 文件vi /etc/sudoers找到这行 root ALL=(ALL) ALL,在他下面添加xxx ALL=(ALL) ALL (这里的xxx是你的用户名)
执行 visudo 命令可以编辑 /etc/sudoers
也可以直接用 vi 来编辑 /etc/sudoers 的效果是一样的;
sudoedit 注:和 sudo 功能差不多;
sudoers 添加下面四行中任意一条
youuser ALL=(ALL) ALL
%youuser ALL=(ALL) ALL
youuser ALL=(ALL) NOPASSWD: ALL
%youuser ALL=(ALL) NOPASSWD: ALL
第一行:允许用户youuser执行sudo命令(需要输入密码).
第二行:允许用户组youuser里面的用户执行sudo命令(需要输入密码).
第三行:允许用户youuser执行sudo命令,并且在执行的时候不输入密码.
第四行:允许用户组youuser里面的用户执行sudo命令,并且在执行的时候不输入密码.
撤销sudoers文件写权限,命令
chmod u-w /etc/sudoers 这样普通用户就可以使用sudo了。
sudo命令的日志
在 ubuntu 中,sudo 的日志默认被记录在 /var/log/auth.log 文件中。
当执行 sudo 命令时,相关日志都是会被记录下来的。
sudo 命令帮助:
sudo -l 列出用户的权限
Sudo 对比 Root
最小权限原则是一种信息和计算机安全概念,它认为授予程序和用户执行任务所需的最少或最低限度的权限。
root 账户下所有命令都有最高权限,也就是相当于所有命令都默认加了 sudo。
以 root 用户登录后,输入到终端的每一条命令都以系统最高权限运行,违反了最小权限原则。
Sudo 提供细粒度的访问控制。它仅向需要它的特定程序授予提升的权限。您知道哪个程序以提升的权限运行,而不是使用 root shell(以 root 权限运行每个命令)。
Sudo 也可以配置为以另一个用户身份运行命令,指定允许哪些用户和组使用 sudo 运行命令,或者通过编辑 sudoers 文件设置以 root 权限运行程序的超时。
因此,不建议使用