Linux 的权限概念相当的重要!这里先简略的了解一下。权限与帐号相关性很高喔!所以,也要玩一下帐号管理!
从前几节课的练习中发现,使用 student 进行一些任务时,总是发现无法顺利的拷贝或者是进行其他的文件管理任务,这是因为『权限不足』所致。 本堂课要来介绍 Linux 基础文件系统,借以了解为何 student 的任务会成功或失败。此外,为了管理权限,有时也需要管理用户帐号, 故基础帐号管理也在本堂课介绍。
Linux 权限的目的是在『保护某些人的文件数据』,因此,读者在认识『权限』的角度上,应该要思考的是『这个文件的权限设置后, 会造成哪个个人?或某群人的读写开放或保护』。所以,这些权限最终都是『应用在某个/某群帐号』上面!而且,权限都是『设置在文件/目录』上, 不是设置在帐号上面的,这也要先厘清。
Linux 的文件权限在设置上,主要依据三种身份来决定,包括:
底下以一个小案例来说明这三种身份的用法。
假设读者还在学校当老师,你有一本书要让班上同学借阅,但你又不想管,此时你会如何决定『这本书 (文件)』的命运? 通常的作法是:
由上面这个简单的小案例,读者应该能够知道,Linux 上面的文件『都是针对帐号』来进行管理的, 只是为了方便管理上的设置 (班级同学与非本班其他同学) ,因此又将非本人的所有帐号分为两类,一类是加入用户所设置的群组, 一个则是没有加入群组的其他人。
单纯的文件权限观察,可以使用 ls -l 或 ll 来查阅,底下为查找系统 /var/spool/mail 这个目录的权限方式:
[student@localhost ~]$ ls -ld /var/spool/mail
drwxrwxr-x. 2 root mail 4096 6月 29 03:29 /var/spool/mail
[ A ][B][C ] [D ] [E ] [ F ] [ G ]
简单的分析,上述的数据共有七个字段,每个字段的意义为:
读者首先可以分析一下这个『文件』的『类型』。之前读者应该看过第一个字符为 - 以及 d 的表示方式,事实上还有很多常见的文件类型, 底下仅为常见的类型介绍:
所以读者可以知道 /var/spool/mail 为一个目录文件 (d 开头,为 directory 的缩写)。确定了文件类型后,接下来的 9 个字符都是 rwx 与减号而已, 从这 9 个字符判断,读者大概可以猜出 rwx 的意义为:
只不过 rwx 该如何与 root, mail 这个用户与群组套上关系?我们可以使用下图来查阅第 1, 3, 4 个字段的相关性:
如上图所示,第一组为文件拥有者的权限,第二组为文件拥有群组的权限,第三组为不是拥有者也没有加入该群组的其他人权限。 所以上述的文件权限为:
[-][rwx][r-x][r--]1 为:代表这个文件名为目录或文件,本例中为文件(-);
1 234 567 890
帐号名称 加入的群组 test1 test1, testgroup test2 test2, testgroup test3 test3, testgroup test4 test4如果有下面两个文件,请分别说明 test1, test2, test3, test4 针对底下两个文件的权限各为何?
-rw-r--r-- 1 root root 238 Jun 18 17:22 test.txt -rwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai
如上面例题,读者可以知道 test1 属于 test1 及 testgroup 群组,所以可以理解帐号与权限的相关性。不过在实际的系统操作中, 若想知道帐号所属的群组,可以使用 id 这个指令来观察即可理解。
而除了 id 可以观察帐号与权限的相关性,在文件类型部份,可以使用前一堂课谈到的 file 来查找。
使用 ls -l 可以很快速的看到文件属性、权限的概观,不过,其实读者也能使用 getfacl 这个指令来了解文件的相关属性与权限。 如下所示,同样使用 /var/spool/mail 作为范本:
[student@localhost ~]$ getfacl /var/spool/mail getfacl: Removing leading '/' from absolute path names # file: var/spool/mail <==文件名 # owner: root <==文件拥有者 # group: mail <==文件群组 user::rwx <==用户的权限 group::rwx <==同群组帐号的权限 other::r-x <==其他人的权限
通过 getfacl 可以更清楚的查找到文件的拥有者与相关的权限设置,只不过就没有文件的类型、修改的时间等参数。
文件的权限与属性的修改,若以 ls -l 的输出来说,则每个部份可以修改的指令参照大致如下:
[student@localhost ~]$ cd /dev/shm/ [student@localhost shm]$ touch checking [student@localhost shm]$ ls -l checking -rw-rw-r--. 1 student student 0 6月 30 15:16 checking [ chmod ] [chown] [chgrp] [ touch ] [ mv ]
由于一般帐号仅能修改自己文件的文件名、时间与权限,无法随意切换用户与群组的设置。因此底下的例题中, 读者应该使用 root 的身份来进行处理,方可顺利进行。首先,切换身份成为 root ,并且将工作目录切换到 /dev/shm。
[student@localhost shm]$ su - password: [root@localhost ~]# cd /dev/shm [root@localhost shm]# ll checking -rw-rw-r--. 1 student student 0 6月 30 15:16 checking
查找系统中是否有名为 daemon 的帐号,如果存在该帐号,请将 checking 的用户改为 daemon 所拥有,而非 student 所拥有。
[root@localhost shm]# id daemon uid=2(daemon) gid=2(daemon) groups=2(daemon) [root@localhost shm]# chown daemon checking [root@localhost shm]# ll checking -rw-rw-r--. 1 daemon student 0 6月 30 15:16 checking
其实 chown 的功能非常多,chown 也可以用来进行群组的修改,也能同时修改文件拥有者与群组。建议读者们应该 man chown 查找相关语法。
系统的群组都纪录在 /etc/group 文件内,若想要了解系统是否存在某个群组,可以使用 grep 这个关键字截取指令来查找。 举例来说,当系统内有 bin 这个群组时,就将 checking 的群组改为 bin 所有,否则就不予修改。
[root@localhost shm]# grep myname /etc/group # 不会出现任何信息,因为没有这个群组存在的意思。 [root@localhost shm]# grep bin /etc/group bin:x:1: <==代表确实有这个群组存在! [root@localhost shm]# chgrp bin checking [root@localhost shm]# ll checking -rw-rw-r--. 1 daemon bin 0 6月 30 15:16 checking
由于文件纪录了三种身份,每种身份都拥有 rwx 的最大权限与 --- 没权限的情况。为了搭配性的方便,于是使用 2 比特的方法来记忆! 亦即是 2 进位的情况:
于是每种身份最低为 0 分,最高则为 r+w+x --> 4+2+1 --> 7 分!而因为有 3 种身份,因此用户,群组,其他人的身份, 最多为 777 最少为 000 。以上述 checking 的分数来说,用户为 rw=6, 群组为 rw=6,其他人为 r=4,亦即该文件权限为 664。
[root@localhost shm]# chmod 740 checking [root@localhost shm]# ll checking -rwxr-----. 1 daemon bin 0 6月 30 15:16 checking
另外,读者也能够通过直观的方式来进行权限的设置,亦即使用 u,g,o 代表用户、群组与其他人, 然后使用 +, -, = 来加入/减少/直接设置权限,使用表列方式说明如下:
chmod | u(user) g(group) o(other) a(all) |
+(加入) -(减去) =(设置) |
r w x | 文件或目录 |
举例来说,让 daemon 可读可写可运行 checking 文件,bin 群组的用户们为可读可写,其他人则为可读,使用符号法的处理方式:
[root@localhost shm]# chmod u=rwx,g=rw,o=r checking [root@localhost shm]# ll checking -rwxrw-r--. 1 daemon bin 0 6月 30 15:16 checking
假如读者需要修改时间参数与文件名,就得要使用 touch 与 mv 这两个指令了。举例来说,让 checking 的修改日期改到 5 月 5 日的中午 12 点, 实验的方式如下:
[root@localhost shm]# touch -t 05051200 checking [root@localhost shm]# ll checking -rwxrw-r--. 1 daemon bin 0 5月 5 12:00 checking
至于文件名的修改则是前一堂课谈到的 mv 这个指令。
帐号管理是系统管理员很重要的一个任务,例如学校的教学环境中,教师通常需要预先建置学生的帐号,以方便学期间上课使用。 公司行号一样也需要让管理员建置好员工的帐号密码,才能让员工顺利的办公。此外,『将帐号分组』也是很重要的一项工作。
读者应该还记得,要登录系统的时候,需要输入两个数据,一个是点击帐号名称,再来则是输入该帐号的密码。 因此,最简单的帐号管理,即是创建帐号与给予密码的任务。
请读者尝试创建一个名为 myuser1 的帐号,以及给予 MypassworD 的密码,方式如下:
[root@localhost ~]# useradd myuser1 [root@localhost ~]# passwd myuser1 Changing password for user myuser1. New password: <==此处输入密码 BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word Retype new password: <==再输入密码一次 passwd: all authentication tokens updated successfully. [root@localhost ~]# id myuser1 uid=1014(myuser1) gid=1015(myuser1) groups=1015(myuser1)
由于系统管理员可以给予帐号任意的密码,因此虽然 MypassworD 并不是一个好密码,不过系统还是予以接受。 而若帐号设置错误,可以使用 userdel 删除帐号,例如:
[root@localhost ~]# userdel -r myuser1
加上 -r 的目的是要该帐号连同家目录与电子邮件新件夹通通删除的意思。如果忘记加上 -r 的话,那就需要手动删除用户的家目录与邮件文件。 底下的例题为重要的帐号管理注意事项,请依序进行下列例题,并自行尝试解决错误。
若需要创建帐号时,给予帐号一个次要的群组支持,就需要先行建置群组。举例而言,以学校专题制作为例,有三个帐号 prouser1, prouser2, prouser3 加入共有的群组 progroup 时,该如何创建?首先,应该要先创建群组,通过 groupadd 来处理,再来则是通过 useradd --help 找到次要群组支持的选项为 -G 的项目, 即可创建好群组、帐号与密码。同时,管理员可以通过 passwd --help 找到 --stdin 的选项来操作密码的给予。整体流程如下:
[root@localhost ~]# groupadd progroup [root@localhost ~]# grep progroup /etc/group progroup:x:1016: <==确定有 progroup 在设置档当中了 [root@localhost ~]# useradd -G progroup prouser1 [root@localhost ~]# useradd -G progroup prouser2 [root@localhost ~]# useradd -G progroup prouser3 [root@localhost ~]# id prouser1 uid=1015(prouser1) gid=1017(prouser1) groups=1017(prouser1),1016(progroup) [root@localhost ~]# echo mypassword mypassword <== echo 会将消息从屏幕上输出 [root@localhost ~]# echo mypassword | passwd --stdin prouser1 Changing password for user prouser1. passwd: all authentication tokens updated successfully. [root@localhost ~]# echo mypassword | passwd --stdin prouser2 [root@localhost ~]# echo mypassword | passwd --stdin prouser3
读者可以发现到使用 passwd --stdin 的方式来给予密码时,密码会纪录到屏幕与 history 的环境中,因此不见得适用于所有需要资安的系统中。 不过对于大量建置帐号时,会是一个很好用的工具。
另外,如果创建好帐号之后才想到要修改群组资源时,不需要删除帐号再重建,此时可以通过 usermod 来进行修改。举例来说,当 prouser1 还需要加入 student 群组时, 可以使用 usermod -G 的方式来处理!不过需要留意到 -a 的选项才行。
用户能使用系统上面的资源与权限有关,因此简易的帐号管理之后,就需要与权限搭配设计。
一般用户只能够修改属于自己的文件的 rwx 权限,因此,若 root 要协助拷贝数据给一般用户时,需要特别注意该数据的权限。 例如底下的范例中,管理员要将 /etc/scuretty 拷贝给 student 时,需要注意相关的事宜如下:
[root@localhost ~]# ls -l /etc/securetty -rw-------. 1 root root 221 Aug 12 2015 /etc/securetty <==一般用户根本没权限 [root@localhost ~]# cp /etc/securetty ~student/ [root@localhost ~]# ls -l ~student/securetty -rw-------. 1 root root 221 Jul 1 19:33 /home/student/securetty [root@localhost ~]# chown student.student ~student/securetty [root@localhost ~]# ls -l ~student/securetty -rw-------. 1 student student 221 Jul 1 19:33 /home/student/securetty
原本 root 拷贝数据给 student 时,若没有考量到权限,则 student 依旧无法读取该文件的内容,这在数据的拷贝行为上,需要特别注意才行。
另外,如果用户想要自己拷贝指令,或者是进行额外的工作任务,可以将指令移动到自己的家目录来处理, 例如 student 想要将 ls 拷贝成为 myls 并且直接运行 myls 来运作系统,可以这样处理:
[student@localhost ~]$ cp /bin/ls myls [student@localhost ~]$ ls -l myls -rwxr-xr-x. 1 student student 117616 7月 1 19:37 myls [student@localhost ~]$ chmod 700 myls [student@localhost ~]$ ls -l myls -rwx------. 1 student student 117616 7月 1 19:37 myls [student@localhost ~]$ myls bash: myls: 找不到指令... [student@localhost ~]$ ./myls bin myipshow.txt myls securetty 下载 公共 图片 视频 文档 桌面 模板 音乐 [student@localhost ~]$ mkdir bin [student@localhost ~]$ mv myls bin [student@localhost ~]$ myls bin myipshow.txt securetty 下载 公共 图片 视频 文档 桌面 模板 音乐
若仅想要让自己运行,可以将权限改为 700 之类的模样。而『在本目录运行』则需要使用『 ./command 』的型态来运行, 若想要直接输入指令即可,那需要放入用户自己家目录下的 bin 子目录才行 (与 $PATH 变量有关)。因此本范例中,最终将 myls 移动到 /home/student/bin/ 目录下。
某些情境下,群组可能需要共享某些文件数据。举例来说,在学校做专题时,同组专题成员可能需要个别的帐号,不过却需要一个共享的目录, 让大家可以共同分享彼此的专题成果。举例来说, progroup 成员 prouser1, prouser2, prouser3 (前小节建置的帐号数据),需要共用 /srv/project1/ 的目录, 则该目录的建置与共享可以使用如下的方式来达成:
[root@localhost ~]# mkdir /srv/project1 [root@localhost ~]# chgrp progroup /srv/project1 [root@localhost ~]# chmod 770 /srv/project1 [root@localhost ~]# ls -ld /srv/project1 drwxrwx---. 2 root progroup 6 7月 1 19:46 /srv/project1
此时 progroup 的成员即可在 project1 目录内进行任何动作。但 770 并非最好的处理方式,下一堂课读者们将会学习到 SGID 的功能, 届时才会学到较为正确的权限设置。
除了共享目录之外,在运行档的可运行权限设计上,也能够针对群组来给予可运行权,让其他人不可随意运行共用的指令。 例如让 mycat 运行与 cat 相同的结果,但是仅有 progroup 的用户能够运行,可以这样运行:
[root@localhost ~]# which cat /bin/cat [root@localhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [root@localhost ~]# cp /bin/cat /usr/local/bin/mycat [root@localhost ~]# ll /usr/local/bin/mycat -rwxr-xr-x. 1 root root 54048 7月 1 22:16 /usr/local/bin/mycat [root@localhost ~]# chgrp progroup /usr/local/bin/mycat [root@localhost ~]# chmod 750 /usr/local/bin/mycat [root@localhost ~]# ll /usr/local/bin/mycat -rwxr-x---. 1 root progroup 54048 7月 1 22:16 /usr/local/bin/mycat
接下来,请读者分别以 student 与 prouser1 的身份运行一次『 mycat /etc/hosts 』,即可发现不同点了。
前置动作:请使用 unit04 的硬盘进入作业环境,并请先以 root 身分运行 vbird_book_setup_ip 指令设置好你的学号与 IP 之后,再开始底下的作业练习。
请使用 root 的身份进行如下实做的任务。直接在系统上面操作,操作成功即可,上传结果的程序会主动找到你的实做结果。
作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX;aa:bb:cc:dd:ee:ff;unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用: http://192.168.251.250 检查相对应的课程文件。