天天看點

《Linux基礎三》使用者和檔案權限管理使用者和檔案權限管理1,使用者2,檔案權限3,特殊檔案權限SUID 、SGID、 SBID4,隐藏檔案權限chattr、lsattr5,檔案通路控制清單ACL

使用者和檔案權限管理

1,使用者

管理者使用者:

Root使用者,也稱根使用者、超級使用者、超級管理者

可對根目錄執行讀寫和執行操作

具有系統中的最高、所有權限

普通使用者:

權限有限的使用者

Root使用者擁有系統的所有權限,等同于作業系統的權限,足以把整個系統的大部分檔案删掉,導緻系統完全毀壞,不能再次使用。是以,用root進行不當的操作是相當危險的,輕微的可以當機,嚴重的甚至不能開機。但是有時候也有一些需要root權限的應用,譬如廣告阻擋。除非确實需要,一般情況下都不推薦使用root。最好單獨建立一個普通的使用者,作為日常之用。

Linux系統是一個多使用者、多任務的作業系統,每個使用者之間都是互相隔離的,每個使用者是通過User Id (UID)來唯一辨別的,相當于人類社會的身份證号碼。

Linux中可以将一個或多個使用者加入使用者組中,組就是包含0個或多個使用者的集合,使用者組是通過Group

ID(GID) 來唯一辨別的。

《Linux基礎三》使用者和檔案權限管理使用者和檔案權限管理1,使用者2,檔案權限3,特殊檔案權限SUID 、SGID、 SBID4,隐藏檔案權限chattr、lsattr5,檔案通路控制清單ACL

使用者(組)分類:

使用者類型 使用者名 使用者ID (uid) 作用
超級管理者**(組)** root(可自定義) 超級管理者
系統使用者**(組)** 自定義

1-499(CentOS6及以前),

1-999(CentOS7及以後)

給背景程式使用,像nginx,mysql等
登入使用者**(組)** 自定義

500+(CentOS6及以前),

1000+(CentOS7及以後)

給使用者進行互動式登入

指令提示符#、$

# 管理者

$ 普通使用者

範例:顯示系統中現有使用者的相關資訊

[[email protected] ~]# lslogins 
  UID USER               PROC PWD-LOCK PWD-DENY  LAST-LOGIN GECOS
    0 root                153        0        0       09:57 root
    1 bin                   0        0        0             bin
    2 daemon                0        0        0             daemon
    3 adm                   0        0        0             adm
    4 lp                    0        0        0             lp
    5 sync                  0        0        0             sync
    6 shutdown              0        0        0 Feb02/01:08 shutdown
    7 halt                  0        0        0             halt
    8 mail                  0        0        0             mail
   11 operator              0        0        0             operator
   12 games                 0        0        0             games
   14 ftp                   0        0        0             FTP User
   59 tss                   0        1        0             Account used for TPM access
   72 tcpdump               0        1        0             
   74 sshd                  0        1        0             Privilege-separated SSH
   81 dbus                  1        1        0             System message bus
   89 postfix               0        1        0             
  193 systemd-resolve       0        1        0             systemd Resolver
  991 setroubleshoot        0        1        0             
  992 unbound               0        1        0             Unbound DNS resolver
  993 chrony                0        1        0             
  994 cockpit-wsinstance    0        1        0             User for cockpit-ws instances
  995 cockpit-ws            0        1        0             User for cockpit web service
  996 sssd                  0        1        0             User for sssd
  997 libstoragemgmt        1        1        0             daemon account for libstoragemgmt
  998 polkitd               1        1        0             User for polkitd
  999 systemd-coredump      0        1        0             systemd Core Dumper
 1000 jett                  0        0        0             
65534 nobody                0        0        0             Kernel Overflow User

           

範例:

[[email protected] ~]# who   #檢視目前登入使用者資訊
root     pts/0        2023-02-02 09:57 (10.0.0.1)
[[email protected] ~]# whoami #列印目前登入使用者,相當于執行”id -un”指令
root
[[email protected] ~]# id     #顯示目前使用者與使用者組資訊
uid=0(root) gid=0(root) groups=0(root)
[[email protected] ~]# w      #顯示目前登入系統的使用者資訊
 10:48:38 up 54 min,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.1         09:57    1.00s  0.04s  0.00s w

           

Linux使用者群組的關系

《Linux基礎三》使用者和檔案權限管理使用者和檔案權限管理1,使用者2,檔案權限3,特殊檔案權限SUID 、SGID、 SBID4,隐藏檔案權限chattr、lsattr5,檔案通路控制清單ACL

使用者和使用者組的對應關系是:一對一、多對一、一對多或多對多

1.一對一:一個使用者可以存在一個組中,是組中的唯一成員;

2.一對多:一個使用者可以存在多個使用者組中,此使用者具有這多個組的共同權限;

3.多對一:多個使用者可以存在一個組中,這些使用者具有群組相同的權限;

4.多對多:多個使用者可以存在多個組中,也就是以上 3 種關系的擴充。

一個使用者至少有一個組,也可以有多個組;

一個組至少有0個使用者,也可以有多個使用者;

使用者的主要組(primary group):又稱私有組,一個使用者必須屬于且隻有一個主組,建立使用者時,預設會建立與其同名的組作為主組;

使用者的附加組(supplementary group):又稱輔助組,一個使用者可以屬于0個或多個附加組;

1.1 使用者管理

1.1.1 使用者管理主要配置檔案

/etc/passwd:使用者及其屬性資訊

/etc/shadow:使用者密碼及其相關屬性

[[email protected] ~]# man 5 passwd 檢視幫助文檔

[[email protected] ~]# man 5 shadow 檢視幫助文檔

#/etc/passwd檔案的每一行代表一個使用者的資訊,用冒号分隔的每一個字段分别代表不同的含義。
第一個字段:使用者名
第二個字段:密碼,這裡的 x 僅僅是一個辨別,真正的密碼加密儲存在 /etc/shadow 中
第三個字段:UID
第四個字段:GID
第五個字段:使用者描述資訊,可不填
第六個字段:使用者家目錄位置
第七個字段:預設shell,用 chsh 指令修改

[[email protected] ~]# cat /etc/passwd |head -3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#/etc/shadow檔案同樣是一行一個使用者的資訊,每個字段有不同含義
第一個字段:使用者名
第二個字段:密碼。有密碼的使用者在這裡都是一串加密過的字元。這裡我填了兩個歎号,表示沒有密碼。
第三個字段:從1970/01/01到最近一次密碼修改經過的時間,以天為機關。
第四個字段:密碼過多久可以被修改,0表示随時可改。
第五個字段:密碼的有效期
第六個字段:密碼要過期前多少天提醒使用者,7就是提前一周提醒。
第七個字段:密碼過期後多少天之内還能登入,但是要登入必須改密碼。
第八個字段:密碼的最長使用期限
第九個字段:系統保留字段

所有僞使用者的密碼都是 "!!" 或 "*",代表沒有密碼是不能登入的,建立使用者還沒設密碼時為!!,禁用賬号,可以直接在密碼字段前加 !
[[email protected] ~]# cat /etc/shadow |head -3
root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::


           

1.1.2 使用者管理指令

useradd指令 – 建立并設定使用者資訊

newusers指令 – 更新和批量建立新使用者

userdel指令 – 删除使用者賬戶

passwd指令 – 設定和修改使用者的密碼值

chpasswd指令 – 批量更新使用者密碼

chage指令 – 修改帳号和密碼的有效期限

usermod指令 – 修改使用者賬号資訊

su指令 – 切換使用者身份

who指令 – 檢視目前登入使用者資訊

groups - 列印使用者所在的組

getent指令 – 檢視系統資料庫中的記錄資訊

1.1.2.1 使用者建立useradd、newusers

useradd指令來自于英文詞組“User add”的全拼,其功能是用于建立并設定使用者資訊。

#文法:
useradd [options] LOGIN
useradd -D
useradd -D [options]
#常見選項
-u|--uid UID #指定UID
-g|--gid GID #指定使用者組,-g groupname|--gid GID
-c|--comment COMMENT #新賬戶的 GECOS 字段
-d|--home-dir HOME_DIR #指定家目錄,可以是不存在的,指定家目錄,并不代表建立
家目錄
-s|--shell SHELL #指定 shell,可用shell在/etc/shells 中可以檢視,指定使用者使用/sbin/nologin,無論是本地還是遠端都不能登入系統,也無法實作系統管理,使用/sbin/nologin的shell的使用者無法切換,ubnutn中使用/bin/false的shell的使用者同樣無法切換
-r|--system #建立系統使用者,CentOS 6之前 ID<500,CentOS7 以後
ID<1000,不會建立登入使用者相關資訊
-m|--create-home #建立家目錄,一般用于登入使用者
-M|--no-create-home #不建立家目錄,一般用于不用登入的使用者
-p|--password PASSWORD #設定密碼,這裡的密碼是以明文的形式存在
于/etc/shadow 檔案中
-o|--non-unique #允許使用重複的 UID 建立使用者
-G|--groups GROUP1[,GROUP2,...] #為使用者指明附加組,組須事先存在
-N|--no-user-group #不建立同名的組,使用users組做主組
-D|--defaults #顯示或更改預設的 useradd 配置,預設配置檔案是
/etc/default/useradd
-e|--expiredate EXPIRE_DATE #指定賬戶的過期日期 YYYY-MM-DD 格式
-f|--inactive INACTIVE #密碼過期之後,賬戶被徹底禁用之前的天數,0 表示密碼過
期立即禁用,-1表示不使用此功能
-k|--skel SKEL_DIR #指定家目錄模闆,建立家目錄,會生成一些預設檔案,如果指定,就從該目錄複制
檔案,預設是/etc/skel/,要配合-m
-K|--key KEY=VALUE #不使用 /etc/login.defs 中的預設值,自己指定,比如
-K UID_MIN=100
-l|--no-log-init #不将使用者添加到最近登入和登入失敗記錄,前面講到的3a認證審計,就在此處
lastlog|lastb|cat /var/log/secure
           

範例:預設建立指定的使用者

[[email protected] ~]# useradd user1                #預設建立使用者user1
[[email protected] ~]# lslogins |grep user1         #檢視使用者user1資訊
 1001 user1                 0        1        0                
[[email protected] ~]# getent passwd user1          #檢視本地的使用者檔案(/etc/passwd)中包含的指定使用者user1資訊
user1:x:1001:1001::/home/user1:/bin/bash
[[email protected] ~]# getent shadow user1      #檢視本地的使用者密碼檔案(/etc/shadow)中包含的指定使用者user1資訊
user1:!!:19390:0:99999:7:::
[[email protected] ~]# getent group user1       #檢視本地的使用者組檔案(/etc/group)中包含的指定使用者user1資訊
user1:x:1001:
[[email protected] ~]# getent gshadow user1     #檢視本地的使用者組密碼檔案(/etc/gshadow)中包含的指定使用者user1資訊
user1:!::
[[email protected] ~]# ls -a /home/user1/       #使用者user1預設家目錄,來源于家目錄子產品檔案/etc/skel。
.  ..  .bash_logout  .bash_profile  .bashrc



[[email protected] ~]# ll /var/spool/mail/user1   
-rw-rw---- 1 user1 mail 0 Feb  2 11:42 /var/spool/mail/user1
[[email protected] ~]# ls -a  /etc/skel    #家目錄模闆,修改此目錄内容後,新建立的使用者家目錄中的内容會發生改變
.  ..  .bash_logout  .bash_profile  .bashrc
[[email protected] ~]# useradd -D      #顯示或更改預設的 useradd 配置,預設配置檔案是/etc/default/useradd
GROUP=100     #useradd不指定組,且/etc/login.defs中的USERGROUPS_ENAB為no或useradd -N時,group 為100
HOME=/home    #此項表示将建立使用者的主目錄放在/home目錄下
INACTIVE=-1   #此項表示是否啟用帳号過期禁用,-1表示不啟用,對應/etc/shadow檔案第7列
EXPIRE=       #此項表示帳号過期日期,不設定表示不啟用,對應/etc/shadow檔案第8列
SHELL=/bin/bash  #此項指定了建立使用者的預設shell類型
SKEL=/etc/skel   #此項用來指定使用者主目錄預設檔案的來源,也就是說建立使用者主目錄下的檔案都是從這個目錄下複制而來的
CREATE_MAIL_SPOOL=yes  
[[email protected] ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
/etc/default/useradd檔案定義了建立使用者的一些預設屬性,比如使用者的主目錄、使用的shell等等,通過更改此檔案,可以改變建立新使用者的預設屬性值


#/etc/login.defs檔案用來定義建立一個使用者時的預設設定,比如指定使用者的UID和GID的範圍,使用者的過期時間、是否需要建立使用者主目錄等等。
[[email protected] ~]# cat /etc/login.defs
#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#

# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR	Maildir
MAIL_DIR	/var/spool/mail   #當建立使用者時,同時在目錄/var/spool/mail中建立一個使用者mail檔案
#MAIL_FILE	.mail

# Default initial "umask" value used by login(1) on non-PAM enabled systems.
# Default "umask" value for pam_umask(8) on PAM enabled systems.
# UMASK is also used by useradd(8) and newusers(8) to set the mode for new
# home directories if HOME_MODE is not set.
# 022 is the default value, but 027, or even 077, could be considered
# for increased privacy. There is no One True Answer here: each sysadmin
# must make up their mind.
UMASK		022

# HOME_MODE is used by useradd(8) and newusers(8) to set the mode for new
# home directories.
# If HOME_MODE is not set, the value of UMASK is used to create the mode.
HOME_MODE	0700

# Password aging controls:
#
#	PASS_MAX_DAYS	Maximum number of days a password may be used.
#	PASS_MIN_DAYS	Minimum number of days allowed between password changes.
#	PASS_MIN_LEN	Minimum acceptable password length.
#	PASS_WARN_AGE	Number of days warning given before a password expires.
#
PASS_MAX_DAYS	99999  #指定密碼保持有效的最大天數
PASS_MIN_DAYS	0      #表示自從上次密碼修改以來多少天後使用者才被允許修改密碼
PASS_MIN_LEN	5      #指定密碼的最小長度
PASS_WARN_AGE	7      #表示在密碼到期前多少天系統開始通知使用者密碼即将到期

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                  1000   #添加使用者時,使用者的UID 從1000開始
UID_MAX                 60000   #指定最大UID為60000
# System accounts
SYS_UID_MIN               201
SYS_UID_MAX               999

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                  1000  #添加組時,組的GID從1000開始
GID_MAX                 60000  #指定最大GID為60000
# System accounts
SYS_GID_MIN               201
SYS_GID_MAX               999

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD	/usr/sbin/userdel_local

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME	yes    #此項是指是否建立使用者主目錄,yes為建立,no為不建立。

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes  #會用和使用者名相同的名字建立使用者組

# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512   #用sha512加密算法

#綜上:建立使用者的相關檔案
/etc/default/useradd
/etc/skel/*
/etc/login.defs
           

範例:使用newusers指令批量建立使用者

#使用指令之前需要建立包含新使用者的檔案,假如是/root/newuserfile,檔案内容如下:
[[email protected] ~]# vim /root/newuserfile 
[[email protected] ~]# cat /root/newuserfile 
linuxcool0:x:520:520::/home/zhangsan0:/bin/bash
linuxcool1:x:521:521::/home/zhangsan1:/bin/bash
linuxcool2:x:521:521::/home/zhangsan2:/bin/bash
#使用此檔案批量建立使用者
[[email protected] ~]# newusers /root/newuserfile 
[[email protected] ~]# id linuxcool0
uid=520(linuxcool0) gid=520(linuxcool0) groups=520(linuxcool0)
[[email protected] ~]# id linuxcool1
uid=521(linuxcool2) gid=521(linuxcool1) groups=521(linuxcool1)
[[email protected] ~]# id linuxcool2
uid=521(linuxcool2) gid=521(linuxcool1) groups=521(linuxcool1)

           

範例:

#建立指定的使用者資訊,但不建立家目錄,亦不讓登入系統
[[email protected] ~]# useradd -M -s /sbin/nologin user2
[[email protected] ~]# id user2
uid=1002(user2) gid=1002(user2) groups=1002(user2)
#建立指定的使用者資訊,并自定義UID值
[[email protected] ~]# useradd -u 6688 user3
[[email protected] ~]# id user3
uid=6688(user3) gid=6688(user3) groups=6688(user3)
#建立使用者前先建組,可以確定組ID是己知的
[[email protected] ~]# groupadd -g 336 -r mysql
[[email protected] ~]# getent group mysql
mysql:x:336:
[[email protected] ~]# getent gshadow mysql
mysql:!::
#建立指定的使用者資訊,并追加指定組為該賬戶的擴充組
[[email protected] ~]# useradd -G mysql user4
[[email protected] ~]# id user4
uid=6689(user4) gid=6689(user4) groups=6689(user4),336(mysql)
#建立指定的使用者資訊,并指定過期時間
[[email protected] ~]# useradd -e "2025/05/05" user5
[[email protected] ~]# id user5
uid=6690(user5) gid=6690(user5) groups=6690(user5)
[[email protected] ~]# getent passwd user5
user5:x:6690:6690::/home/user5:/bin/bash
[[email protected] ~]# getent shadow user5
user5:!!:19390:0:99999:7::20213:
#建立多項定義的使用者
[[email protected] ~]# useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
[[email protected] ~]# getent shadow mysql 
mysql:!!:19390::::::
[[email protected] ~]# getent passwd mysql 
mysql:x:336:336::/data/mysql:/sbin/nologin
[[email protected] ~]# getent group mysql 
mysql:x:336:user4
[[email protected] ~]# getent gshadow mysql 
mysql:!::user4

           

1.1.2.2 使用者屬性修改usermod

usermod指令來自于英文詞組“user modify”的縮寫,其功能是用于修改使用者帳戶的屬性。

文法:
usermod [options] LOGIN
#常見選項
-c|--comment COMMENT #修改注釋
-d|--home HOME_DIR #修改家目錄
-e|--expiredate EXPIRE_DATE #修改過期的日期,YYYY-MM-DD 格式
-f|--inactive INACTIVE #密碼過期之後,賬戶被徹底禁用之前的天數,0 表示密碼過期立即禁用,-1表示不使用此功能
-g|--gid GROUP #修改組
-G|--groups GROUPS #groupName|GID... 新附加組,原來的附加組将會被覆寫;若保留原有,則要同時使用-a選項
-a|--append GROUP #将使用者追加至上邊 -G 中提到的附加組中,并不從其它組中删除此使用者
-l|--login LOGIN #新的登入名稱
-L|--lock #鎖定使用者帳号,在/etc/shadow 密碼欄的增加 !
-m|--move-home #将家目錄内容移至新位置,和 -d 一起使用
-o|--non-unique #允許使用重複的(非唯一的) UID
-p|--password PASSWORD #修改密碼,這裡是明文,如果要在此處修改密碼,則要用加密後的字元串
-s|--shell SHELL #修改 shell
-u|--uid UID #修改 UID
-U|--unlock #解鎖使用者帳号,将 /etc/shadow 密碼欄的!拿掉
           

範例:修改使用者

[[email protected] ~]# useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
[[email protected] ~]# getent shadow mysql 
mysql:!!:19390::::::
[[email protected] ~]# getent passwd mysql 
mysql:x:336:336::/data/mysql:/sbin/nologin
[[email protected] ~]# getent group mysql 
mysql:x:336:user4
[[email protected] ~]# getent gshadow mysql 
mysql:!::user4

#修改指定使用者的家目錄路徑
[[email protected] ~]# usermod -d /home mysql 
[[email protected] ~]# getent shadow mysql 
mysql:!!:19390::::::
[[email protected] ~]# getent passwd mysql 
mysql:x:336:336::/home:/sbin/nologin
#修改指定使用者的UID号碼
[[email protected] ~]# id mysql 
uid=336(mysql) gid=336(mysql) groups=336(mysql)
[[email protected] ~]# usermod -u 6688 mysql #不可占用己存在的UID、GID
usermod: UID '6688' already exists
[[email protected] ~]# usermod -u 1234 mysql 
[[email protected] ~]# id mysql 
uid=1234(mysql) gid=336(mysql) groups=336(mysql)
#修改指定使用者的名稱并備注資訊
[[email protected] ~]# id mysql 
uid=1234(mysql) gid=336(mysql) groups=336(mysql)
[[email protected] ~]# usermod -c "mysql to newmysql" -l newmysql mysql
[[email protected] ~]# id mysql
id: ‘mysql’: no such user
[[email protected] ~]# id newmysql
uid=1234(newmysql) gid=336(mysql) groups=336(mysql)
           

範例:鎖定使用者,使密碼無效

#鎖定指定使用者的賬戶,臨時不允許登入系統
[[email protected] ~]# usermod -L jett
[[email protected] ~]# getent shadow jett
jett:!$6$wrYwzcQGIzCWUyU6$LoNSlWvL3M9GS4WE0Q9YAqgxkESrLAImEGZd/mD98RDkzfUwU.McQgkACw3EHHPmwtH2z/1uOXKGXP0EAygxO.::0:99999:7:::
#解鎖指定使用者的賬戶,再次允許登入系統
[[email protected] ~]# usermod -U jett
[[email protected] ~]# getent shadow jett
jett:$6$wrYwzcQGIzCWUyU6$LoNSlWvL3M9GS4WE0Q9YAqgxkESrLAImEGZd/mD98RDkzfUwU.McQgkACw3EHHPmwtH2z/1uOXKGXP0EAygxO.::0:99999:7:::


#centos允許空密碼使用者登入,是以兩個 !!,無法用 -U 選項解鎖,但是,可以直接修改/etc/shadow 檔案,将密碼欄置空産生空密碼使用者
[[email protected] ~]# id newmysql 
uid=1234(newmysql) gid=336(mysql) groups=336(mysql)
[[email protected] ~]# getent shadow newmysql 
newmysql:!!:19390::::::
[[email protected] ~]# usermod -L newmysql 
[[email protected] ~]# getent shadow newmysql 
newmysql:!!:19390::::::
[[email protected] ~]# usermod -U newmysql 
usermod: unlocking the user's password would result in a passwordless account.
You should set a password with usermod -p to unlock this user's password.
[[email protected] ~]# getent shadow newmysql 
newmysql:!!:19390::::::

           

1.1.2.3 使用者賬戶删除userdel

userdel指令來自于英文詞組“user delete”的縮寫,其功能是删除使用者帳戶和相關檔案。Linux系統中一切都是檔案,使用者資訊被儲存到了/etc/passwd、/etc/shadow以及/etc/group檔案中,是以使用userdel指令實際就是幫助我們删除了指定使用者在上述三個檔案中的對應資訊。

#文法:
userdel [options] LOGIN
#常用參數:
-f	強制删除使用者賬号,正在登入狀态的使用者也可以删除
-r	删除使用者主目錄及其中的任何檔案
           

範例:删除指定的使用者賬戶資訊

《Linux基礎三》使用者和檔案權限管理使用者和檔案權限管理1,使用者2,檔案權限3,特殊檔案權限SUID 、SGID、 SBID4,隐藏檔案權限chattr、lsattr5,檔案通路控制清單ACL
[[email protected] ~]$ whoami
whoami: cannot find name for user ID 1001
#使用者被删除後,其名下的檔案無法顯示屬主屬組,隻能顯示UID
[[email protected] ~]# ll -a /home/user1
total 12
drwx------   2 1001 1001  62 Feb  2 11:42 .
drwxr-xr-x. 10 root root 121 Feb  2 13:08 ..
-rw-r--r--   1 1001 1001  18 Aug  2  2022 .bash_logout
-rw-r--r--   1 1001 1001 141 Aug  2  2022 .bash_profile
-rw-r--r--   1 1001 1001 376 Aug  2  2022 .bashrc
#如果建立使用者,使用了原使用者的UID,則可以繼承原使用者檔案
[[email protected] ~]# useradd -u 1001 newuser1
[[email protected] ~]# ll -a /home/newuser1
total 12
drwx------   2 newuser1 newuser1  62 Feb  2 14:21 .
drwxr-xr-x. 11 root     root     137 Feb  2 14:21 ..
-rw-r--r--   1 newuser1 newuser1  18 Aug  2  2022 .bash_logout
-rw-r--r--   1 newuser1 newuser1 141 Aug  2  2022 .bash_profile
-rw-r--r--   1 newuser1 newuser1 376 Aug  2  2022 .bashrc
#删除指定的使用者賬戶資訊及家目錄
[[email protected] ~]# userdel -rf newuser1
userdel: user newuser1 is currently used by process 2459
[[email protected] ~]# id newuser1
id: ‘newuser1’: no such user

           

1.1.2.4 使用者密碼設定passwd

passwd指令來自于英文單詞password的縮寫,其功能适用于修改使用者的密碼值,修改密碼其實就是更新 /etc/shadow 檔案。同時也可以對使用者進行鎖定等操作,但需要管理者身份才可以執行。

#文法:
passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [-?] [--usage] [username]
#常用選項
-k|--keep-tokens #保持身份驗證令牌不過期
-d|--delete #删除使用者密碼,也删除密碼鎖,僅root有權限操作
-l|--lock #鎖定使用者密碼,僅root有權限操作
-u|--unlock #解鎖使用者密碼,僅root有權限操作
-e|--expire #終止使用者密碼,此操作完成後,使用者下次登入成功後要立馬修改,僅root有權限操作
-f|--force #強制執行操作
-x|--maximum=DAYS #指定使用者密碼最長有效期,僅root有權限操作
-n|--minimum=DAYS #指定使用者密碼最短有效期,僅root有權限操作
-w|--warning=DAYS #在密碼過期前多少天開始提醒使用者,僅root有權限操作
-i|--inactive=DAYS #當密碼過期後經過多少天該使用者賬号會被禁用,僅root有權限操作
-S|--status #查詢使用者的密碼狀态,僅root有權限操作
--stdin #從标準輸入接收密碼,Ubuntu無此選項
           

範例:

#修改目前登入使用者的密碼值
Changing password for user root.
New password: 輸入密碼
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic 密碼過于簡單報提示
Retype new password: 再次輸入密碼
passwd: all authentication tokens updated successfully.
#修改指定使用者的密碼值,僅root權限
[[email protected] ~]# passwd  user1
#檢視指定使用者的密碼狀态
[[email protected] ~]# passwd  -S root
root PS 1969-12-31 0 99999 7 -1 (Password set, SHA512 crypt.)
#強制指定的使用者在下次登陸時必須重置其密碼
[[email protected] ~]# passwd  -e user1
#删除指定使用者的密碼值
[[email protected] ~]# passwd -d user2
Removing password for user user2.
passwd: Note: deleting a password also unlocks the password.
passwd: Success
[[email protected] ~]# passwd user2
Changing password for user user2.
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.
[[email protected] ~]# getent shadow user2
user2:$6$z73dgtJohvibO9s0$QhYKE4ajBxooKKbnZusjVBsIj4SHZhy4kc7HrP8L4p39kokYfWYdRrsGiaCytwYQ2Po2xuhNfjeMlJuWUyCr5.:19390:0:99999:7:::
#鎖定指定使用者的密碼值,不允許其進行修改
[[email protected] ~]# passwd -l user2
Locking password for user user2.
passwd: Success
#解鎖指定使用者的密碼值,允許其進行修改
[[email protected] ~]# passwd -u user2
Unlocking password for user user2.
passwd: Success
           

範例:非互動式修改使用者密碼

#适用于紅帽系列的Linux版本,Ubuntu中 passwd 無 --stdin 選項。
[[email protected] ~]# echo '123456' | passwd --stdin user3
[[email protected] ~]# passwd --stdin jose <<<123456
#通用寫法,此寫法在centos中也支援
[email protected]:~# echo -e '123456\n123456' | passwd jose
           

1.1.2.5 使用者密碼批量更新chpasswd

chpasswd指令是批量更新使用者密碼的工具,是把一個檔案内容重新定向添加到/etc/shadow中。

範例:

[[email protected] ~]# cat newuserfile 
linuxcool0:x:520:520::/home/zhangsan0:/bin/bash
linuxcool1:x:521:521::/home/zhangsan1:/bin/bash
linuxcool2:x:521:521::/home/zhangsan2:/bin/bash
[[email protected] ~]# getent shadow linuxcool0 linuxcool1 linuxcool2
linuxcool0:$6$Ap2It/Kzcat/p$ixQ9r3MyiKtN9W5JFSmdfJ43rqGOOxBdDgV7C3m1HYfproIQYKiUjLee4tK62PoOSRVw4cXar2mXIqPc3ooz.1:19390:0:99999:7:::
linuxcool1:$6$vffQg/ay4yX$EqBWRUFTjfZ/FjzkoS7xNIJDQkLnj3kKswx2ke2F8.X4l9falbuBeCsrOaLZZoEGGgV18xq9v4ueI6wX8gbn4/:19390:0:99999:7:::
linuxcool2:$6$Fb04Q/DIvvHIhQ$tOZ8SU5bQB55IZ8q/TQ0KtYa94/D3Bqsi2P./A3492mMPuUGQuWxRnvZm9TY..7pYYttc.NQFr8wMJRB5Mu7A0:19390:0:99999:7:::
[[email protected] ~]# echo "linuxcool0:aa123456" > passfile
[[email protected] ~]# echo "linuxcool1:bb345678" >> passfile
[[email protected] ~]# echo "linuxcool2:cc567890" >> passfile
[[email protected] ~]# cat passfile 
linuxcool0:aa123456
linuxcool1:bb345678
linuxcool2:cc567890
[[email protected] ~]# chpasswd < passfile 
[[email protected] ~]# getent shadow linuxcool0 linuxcool1 linuxcool2
linuxcool0:$6$7DRKYTbZRr/Gt3Og$m7Opti/h0SDr2xliTJCTlX9UpGza4eGXiSh2zce/V8HsRJTGvVzvmhVCDtMXeykpkPm8k7lPw1LHVxXUcTGBm1:19390:0:99999:7:::
linuxcool1:$6$BOujs/YvYZg/WY$Z97CzROmVCE2NY4BOdcR/YrR1Ft5ahyzanxItvIcPmuBvGeAscgkBKbbtRKR.LqQyTap0FOuSVRP1EXuclnwt1:19390:0:99999:7:::
linuxcool2:$6$oji6L/U.YCJ/kuV$tne/qgduD2Ju0/UWqPqEc4vvKY6g.f9RPCdys6ReqDkhgc.tZE2Ukg.NvDUCTg343gQvVrwJNiqCxMD3gV5us.:19390:0:99999:7:::

           

1.1.2.6 使用者密碼政策設定chage

chage指令是用來更改使用者帳号和密碼過期資訊。

#文法: chage [options] LOGIN
#常見選項
-d LAST_DAY #更改密碼的時間
-m|--mindays MIN_DAYS   #密碼保持有效的最小天數
-M|--maxdays MAX_DAYS   #密碼保持有效的最大天數
-W|--warndays WARN_DAYS #使用者密碼到期前,提前收到警告資訊的天數
-I|--inactive INACTIVE #密碼過期後的寬限期
-E|--expiredate EXPIRE_DATE #使用者的有效期,帳号到期的日期,會禁止此帳号
-l #顯示密碼政策
           

範例:

#使用-l參數列出使用者密碼過期的設定,即顯示使用者密碼政策
[[email protected] ~]# chage -l root
Last password change					: never
Password expires					: never
Password inactive					: never
Account expires						: never
Minimum number of days between password change		: 0
Maximum number of days between password change		: 99999
Number of days of warning before password expires	: 7
#使用-M參數設定user2使用者的密碼最大有效期為100天
[[email protected] ~]# chage -M 100 user2
[[email protected] ~]# getent shadow user2
user2:$6$DoHfEFJkV2RtQUj8$Cvf0pN9z6JVGr1IUxdMPGe0Hj9DM19k9awelGrIs4GtKHT4KXtQX8tHpJrx2qCq05U3WxmbdzGvypvKtHfTgL1:19390:0:100:7:::
#自定義使用者user2密碼政策
[[email protected] ~]# chage  user2
Changing the aging information for user2
Enter the new value, or press ENTER for the default

	Minimum Password Age [0]: 3  #密碼保持有效的最小天數
	Maximum Password Age [100]: 100  #密碼保持有效的最大天數
	Last Password Change (YYYY-MM-DD) [2023-02-02]: 2023-02-03 #更改密碼的時間
	Password Expiration Warning [7]: 2 #使用者密碼到期前,提前收到警告資訊的天數
	Password Inactive [-1]: 1  #密碼過期後的寬限期
	Account Expiration Date (YYYY-MM-DD) [-1]: 2023-04-18 #使用者的有效期,帳号到期的日期,會禁止此帳号
[[email protected] ~]# chage -l user2
Last password change					: Feb 03, 2023
Password expires					: May 14, 2023
Password inactive					: May 15, 2023
Account expires						: Apr 18, 2023
Minimum number of days between password change		: 3
Maximum number of days between password change		: 100
Number of days of warning before password expires	: 2
[[email protected] ~]# getent shadow user2
user2:$6$DoHfEFJkV2RtQUj8$Cvf0pN9z6JVGr1IUxdMPGe0Hj9DM19k9awelGrIs4GtKHT4KXtQX8tHpJrx2qCq05U3WxmbdzGvypvKtHfTgL1:19391:3:100:2:1:19465:


-d LAST_DAY #更改密碼的時間
-m|--mindays MIN_DAYS   #密碼保持有效的最小天數
-M|--maxdays MAX_DAYS   #密碼保持有效的最大天數
-W|--warndays WARN_DAYS #使用者密碼到期前,提前收到警告資訊的天數
-I|--inactive INACTIVE #密碼過期後的寬限期
-E|--expiredate EXPIRE_DATE #使用者的有效期,帳号到期的日期,會禁止此帳号
           

1.1.3 使用者組管理主要配置檔案

/etc/group:組及其屬性資訊

/etc/gshadow:組密碼及其相關屬性

[[email protected] ~]# man group 檢視幫助文檔

[[email protected] ~]# man gshadow 檢視幫助文檔

#/etc/group檔案一行有四個字段其含義如下
第一個字段是組名
第二個字段是組密碼,這裡的 x 和 /etc/passwd 的密碼字段差不多。
第三個字段就是GID
第四個字段是組中的使用者
[[email protected] ~]# cat /etc/group |head -3
root:x:0:
bin:x:1:
daemon:x:2:

#/etc/gshadow檔案中,每行代表一個組使用者的密碼資訊,各行資訊用 ":" 作為分隔符分為 4 個字段,每個字段的含義如下:
第一個字段是組名,同 /etc/group 檔案中的組名相對應
第二個字段是組密碼
第三個字段是組管理者
第四個字段是組附加使用者清單,桶/etc/group 檔案中附加組顯示内容相同
[[email protected] ~]# cat /etc/gshadow |head -3
root:::
bin:::
daemon:::

           

1.1.4 使用者組管理指令

建立新的使用者組-groupadd

修改使用者組屬性-groupmod

删除使用者組-groupdel

更改組成員和密碼-gpasswd

管理使用者主組的成員-groupmems

使用者組切換-newgrp

1.1.4.1 使用者組建立groupadd

groupadd指令來自于英文詞組“group add”,使用指令行中指定的值加上系統中的預設值建立新的組帳戶。新組将根據需要輸入到系統檔案中。

#文法:groupadd [options] group
#常見選項
-f|--force #如果組已經存在則成功退出
-g|--gid GID #建立組時指定組ID,預設是系統配置設定,指定值不要超過[GID_MIN,GID_MAX]
-K|--key KEY=VALUE #不使用 /etc/login.defs 中的預設值,自己指定,比如 -K GID_MIN=100
-o|--non-unique #允許建立有重複 GID 的組
-p|--password PASSWORD #為新組使用此加密過的密碼,這裡要用加密後的密文,不然就是直接是明文在/etc/gshadow 裡面
-r|--system #建立一個系統組 CentOS 6之前: ID<500,CentOS 7以後: ID<1000
           

範例:

#建立一個新的使用者組,指定GID号碼并設定為系統工作組
[[email protected] ~]# groupadd -g 1234 -r group1
[[email protected] ~]# getent group group1 
group1:x:1234:

           

1.1.4.2 使用者組屬性修改groupmod

groupmod修改系統上的使用者組屬性。

#文法:groupmod [options] GROUP
#常見選項
-g|--gid GID #将組 ID 改為 GID
-n|--new-name NEW_GROUP #改名為 NEW_GROUP
-o|--non-unique #允許使用重複的 GID
-p|--password PASSWORD #将密碼更改為(加密過的) PASSWORD
           

範例:

#更改user2使用者的使用者組名稱為user2.ng
[[email protected] ~]# groups user2
user2 : user2
[[email protected] ~]# groupmod -n user2.ng user2
[[email protected] ~]# groups user2
user2 : user2.ng
#更改使用者組的GID
[[email protected] ~]# cat /etc/group|tail -5
mysql:x:336:user4
user4:x:6689:
user5:x:6690:
group1:x:1234:
user2.ng:x:1002:
[[email protected] ~]# groupmod -g 11111 group1 
[[email protected] ~]# cat /etc/group|grep group1
group1:x:11111:

           

1.1.4.3 使用者組删除groupdel

groupdel指令用于删除指定的工作組,本指令要修改的系統檔案包括/ect/group和/ect/gshadow。

#文法:groupdel [options] GROUP
#常見選項
-f|--force #強制删除,即使是使用者的主組也強制删除組,但會導緻無主組的使用者不可用無法登入
           

範例:

[[email protected] ~]# cat /etc/group|tail -5
mysql:x:336:user4
user4:x:6689:
user5:x:6690:
group1:x:11111:
user2.ng:x:1002:
[[email protected] ~]# groupdel group1
[[email protected] ~]# getent group group1
[[email protected] ~]# 
           

1.1.4.4 使用者組成員和密碼修改gpasswd

gpasswd指令,可以更改組密碼,也可以修改附加組的成員關系,管理/etc/group和/etc/gshadow;組沒有密碼的情況下,加組隻能由root來操作。

#文法:gpasswd [option] group
#常用參數:
-a	添加使用者到組
-d	從組中删除使用者
-A	指定組管理者
-M	指定組成員
-r	删除組密碼
-R	限制使用者登入組
           

範例:

[[email protected] ~]# groupadd group1 
[[email protected] ~]# groupadd group2
[[email protected] ~]# getent group group1 group2
group1:x:6691:
group2:x:6695:
[[email protected] ~]# useradd u1
[[email protected] ~]# useradd u2
[[email protected] ~]# useradd u3
[[email protected] ~]# getent passwd u1 u2 u3
u1:x:6691:6692::/home/u1:/bin/bash
u2:x:6692:6693::/home/u2:/bin/bash
u3:x:6693:6694::/home/u3:/bin/bash
#将指定使用者加入到指定使用者組
[[email protected] ~]# groups u1
u1 : u1
[[email protected] ~]# gpasswd -a u1 group1
Adding user u1 to group group1
[[email protected] ~]# groups u1
u1 : u1 group1
[[email protected] ~]# groupmems -g group1 -l
u1 
#将指定使用者從指定使用者組中删除
[[email protected] ~]# gpasswd -d  u1 group1
Removing user u1 from group group1
[[email protected] ~]# groups u1
u1 : u1
#為指定使用者組設定管理密碼
[[email protected] ~]# gpasswd group1
Changing the password for group group1
New Password: 輸入密碼
Re-enter new password:  再次輸入
[[email protected] ~]# getent gshadow group1  
group1:$6$M2QGYQRzI$TwymD.qx1GGZJLevrs2iAx2n2cHqgPr8vhPCY/vIERtqWk63ADaXOCYihtNU5TjOQVyUBGpA3OlvBEH29xrkA0::u1
#删除指定使用者組中的管理密碼
[[email protected] ~]# gpasswd -r group1
[[email protected] ~]# getent gshadow group1
group1:::u1

           

1.1.4.5 使用者主組成員管理groupmems

groupmems管理使用者主組的成員。

#文法:groupmems -a user_name | -d user_name | [-g group_name] | -l | -p
#常見選項
-g|--group groupname #更改為指定組 (隻有root)
-a|--add username #指定使用者加入組
-d|--delete username #從組中删除使用者
-p|--purge #從組中清除所有成員
-l|--list #顯示組成員清單
           

範例:

#列出以group1 組為附加組的使用者
[[email protected] ~]# groupmems -g group1 -l
u1 
#設定使用者u2的主要組群為group1
[[email protected] ~]# groupmems -g group1 -a u2
[[email protected] ~]# groupmems -g group1 -l
u1  u2 
[[email protected] ~]# groups u2
u2 : u2 group1
#切換使用者組,臨時切換使用者組,這裡就要用到上面gpasswd 給組設定的密碼
#普通使用者切組需要密碼,root使用者切組不需要密碼
##切換之後建立的檔案屬組就是切換後的組了
[[email protected] ~]# newgrp group1
[[email protected] ~]# touch fg2
[[email protected] ~]# ll fg2
-rw-r--r-- 1 root group1 0 Feb  2 17:23 fg2
[[email protected] ~]# newgrp group2
[[email protected] ~]# touch fg1
[[email protected] ~]# ll fg1
-rw-r--r-- 1 root group2 0 Feb  2 17:22 fg1
[[email protected] ~]# newgrp root
[[email protected] ~]# touch fgr
[[email protected] ~]# ll fgr
-rw-r--r-- 1 root root 0 Feb  2 17:27 fgr
           

1.1.5 nobody使用者和/sbin/nologin

在Linux系統中同樣有一些使用者帳戶是在系統安裝後就有的,用來完成特定任務的,比如nobody和ftp。nobody是一個普通使用者,同時nobody使用者都是僞使用者,非特權使用者,其 UID 和 GID 不提供任何特權,該uid和gid隻能通路人人皆可讀寫的檔案,隻能通路伺服器上的公共内容,預設登入shell是’/sbin/nologin’,是以這個使用者是無法直接登入系統的。簡單了解就是nobody相當于Windows系統中的匿名帳戶。

《Linux基礎三》使用者和檔案權限管理使用者和檔案權限管理1,使用者2,檔案權限3,特殊檔案權限SUID 、SGID、 SBID4,隐藏檔案權限chattr、lsattr5,檔案通路控制清單ACL
[[email protected] ~]# id nobody
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
[[email protected] ~]# cat /etc/passwd |grep nobody  #系統中會預設建立一個nobody
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
           

指定使用者shell類型使用/sbin/nologin,無論是本地還是遠端都不能登入系統,也無法實作系統管理,即使給了密碼也不行。所謂“無法登陸”指的僅是這個使用者無法使用bash或其他shell來登陸系統而已,并不是說這個賬号就無法使用系統資源,是以限于能登陸shell的使用者可以使用 /etc/nologin 檔案臨時禁止登入,直到删除/etc/nologin檔案後,一般使用者才可以正常登入。

[[email protected] ~]# useradd -s /sbin/nologin mysql  #指定使用者使用/sbin/nologin,無論是本地還是遠端都不能登入系統,也無法實作系統管理,
[[email protected] ~]# getent passwd mysql 
mysql:x:1001:1001::/home/mysql:/sbin/nologin
[[email protected] ~]# su - mysql       #此帳戶目前不可用
This account is currently not available.
[[email protected] ~]# su - mysql -c "touch testfile"  #不切換使用者,而是臨時使用該使用者權限和環境執行指令也不行
This account is currently not available.
[[email protected] ~]# su - mysql -s /bin/bash  #指定shell類型進而切換使用者,但是并不沒有真正改變shell類型
Last login: Sun Dec  4 13:11:35 CST 2022 on pts/1
[[email protected] ~]$ getent passwd mysql
mysql:x:1001:1001::/home/mysql:/sbin/nologin
[[email protected] ~]$ whoami ; id
mysql
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql)
[[email protected] ~]$ touch testfile
[[email protected] ~]$ ls
testfile
           

對于那些登陸shell為/sbin/nologin的使用者來說 /etc/nologin 檔案沒有影響,因為他們本身就無法登陸shell,想要讓某個具有 /sbin/nologin 的使用者也能知道知道,可以建立 /etc/nologin.txt 這個檔案,在檔案内面寫上不能登陸的原因,當使用者登入時,螢幕上就會出現這個檔案裡面的内容。

[[email protected] ~]# echo "This account is system account or mail account." > /etc/nologin.txt
[[email protected] ~]# su - mail
This account is system account or mail account.
[[email protected] ~]# su - ftp
This account is system account or mail account.
[[email protected] ~]# su - sshd
This account is system account or mail account.
[[email protected] ~]# su - nobody 
This account is system account or mail account.
[[email protected] ~]# getent passwd mail ftp sshd nobody 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
[[email protected] ~]# rm -rf /etc/nologin
[[email protected] ~]# rm -rf /etc/nologin.txt
[[email protected] ~]# su - mail      #為什麼删除了/etc/nologin和/etc/nologin.txt還是會有提示?怎麼解決?
Last login: Sat Feb  4 09:58:38 CST 2023 on pts/0
This account is currently not available.
[[email protected] ~]# whoami
root

           

總結:

nobody是linux/unix系統下的匿名使用者,隻能通路伺服器上的公共内容

/sbin/nologin是linux/unix系統下的一種shell設定項對于登陸shell為/sbin/nologin的使用者是不允許登入系統的

/etc/nologin.txt隻針對shell為/sbin/nologin的使用者

/etc/nologin可以了解為針對所有普通使用者

1.1.6 id指令顯示使用者群組ID

id指令列印真實有效的使用者群組ID。

#文法:
id [OPTION]... [USER]
#常用參數:
-g	顯示使用者所屬群組的ID
-G	顯示使用者擴充群組的ID
-n	顯示使用者所屬群組或擴充群組的名稱
-r	顯示實際ID
-u	顯示使用者ID
           

範例:

#顯示目前使用者的身份資訊
[[email protected] ~]# id
uid=0(root) gid=0(root) groups=0(root),6691(group1),6695(group2)
#-g 顯示目前使用者的所屬群組GID,-u 顯示目前使用者的身份碼UID
[[email protected] ~]# id -g
0
[[email protected] ~]# id -u
0
查詢指定使用者的身份資訊
[[email protected] ~]# id u1
uid=6691(u1) gid=6692(u1) groups=6692(u1),6691(group1)
           

面試題:

需求:手動建立一個使用者,使用者名為zhangsan,uid設定為1024(前提是這個uid沒有被占用),gid也設定為1024,組名與使用者名同名,家目錄在/home/zhangsan、預設shell為/bin/bash

1.1.7 使用者身份切換su

su指令來自于英文單詞“switch user”的縮寫,其功能是用于切換使用者身份,并且以指定使用者的身份執行指令,實質是使用替換使用者群組ID運作指令。管理者切換至任意使用者身份而無需密碼驗證,而普通使用者切換至任意使用者身份均需密碼驗證。另外添加單個減号(-)參數為完全的身份變更,不保留任何之前使用者的環境變量資訊。

#文法:
su [options] [-] [user [argument...]]
#常見選項
-m|-p|--preserve-environment #不重置環境變量
-g|--group group #指定主組,隻有root 切普通使用者才能指定此參數
-|-l|--login #完全切換
-c|--command command #不切換使用者,而是臨時使用該使用者權限和環境執行指令
--session-command command #使用上同 -c 選項,但不會建立會話
-f|--fast #向shell 傳遞 -f 選項(csh 或 tcsh)
-s|--shell shell #切換使用者後,指定新環境的shell環境,必須在 /etc/shells中存在
-P|--pty #開一個新的終端

#切換使用者的方式:
su UserName:非登入式切換,即不會讀取目标使用者的配置檔案,不改變目前工作目錄,即不完全切換
su - UserName:登入式切換,會讀取目标使用者的配置檔案,切換至自已的家目錄,即完全切換
#注意:su 切換新使用者後,使用 exit 退回至舊的使用者身份,而不要再用 su 切換至舊使用者,否則會生成很多的bash子程序,環境可能會混亂。

           

範例:

[[email protected] ~]# whoami ; id
root
uid=0(root) gid=0(root) groups=0(root)
[[email protected] ~]# su - jett #從root管理者切換至普通使用者,不需要密碼,減号(-)意味着完全切換到新的使用者,比較推薦這種方式。
[[email protected] ~]$ whoami ; id
jett
uid=1000(jett) gid=1000(jett) groups=1000(jett)
[[email protected] ~]$ su - root  #從普通使用者切換成root管理者就需要進行密碼驗證
Password: 輸入root管理者密碼
Last login: Sun Dec  4 12:44:48 CST 2022 on pts/1
[[email protected] ~]# whoami ; id
root
uid=0(root) gid=0(root) groups=0(root)

           

範例:使用/sbin/nologin的shell的使用者無法切換,ubnutn 中使用/bin/false的shell的使用者同樣無法切換

[[email protected] ~]# useradd -s /sbin/nologin mysql  #指定使用者使用/sbin/nologin,無論是本地還是遠端都不能登入系統,也無法實作系統管理
[[email protected] ~]# getent passwd mysql 
mysql:x:1001:1001::/home/mysql:/sbin/nologin
[[email protected] ~]# su - mysql       #此帳戶目前不可用
This account is currently not available.
[[email protected] ~]# su - mysql -c "touch testfile"  #不切換使用者,而是臨時使用該使用者權限和環境執行指令也不行
This account is currently not available.
[[email protected] ~]# su - mysql -s /bin/bash  #指定shell類型進而切換使用者,但是并不沒有真正改變shell類型
Last login: Sun Dec  4 13:11:35 CST 2022 on pts/1
[[email protected] ~]$ getent passwd mysql
mysql:x:1001:1001::/home/mysql:/sbin/nologin
[[email protected] ~]$ whoami ; id
mysql
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql)
[[email protected] ~]$ touch testfile
[[email protected] ~]$ ls
testfile

           

範例:切換到root使用者

[[email protected] ~]$ su -
Password: 
Last login: Sat Feb  4 11:51:31 CST 2023 on pts/0
[[email protected] jett]# whoami
root
           

1.1.8 授權普通使用者執行管理者指令sudo

sudo允許一個使用者作為超級使用者或安全政策指定的其他使用者執行指令,預設的安全政策是sudoers,安全政策決定了使用者運作sudo的權限。配置sudo服務可以直接編輯配置檔案/etc/sudoers,亦可以執行visudo指令(自動調用vi編輯器來配置/etc/sudoers權限檔案)進行設定。

#文法
sudo -h | -K | -k | -V
sudo -v [-ABknS] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-ABknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
sudo [-ABbEHnPS] [-C num] [-g group] [-h host] [-p prompt] [-r role] [-t type] [-T timeout] [-u user [VAR=value] [-i | -s] [command]
#常用選項
-l	列出目前使用者可執行的指令
-u 使用者名或UID值	以指定的使用者身份執行指令
-k	清空密碼的有效時間,下次執行sudo時需要再次進行密碼驗證
-b	在背景執行指定的指令
-p	更改詢問密碼的提示語
#使用sudoedit指令可以以另外一個使用者身份編輯檔案
sudoedit [-ABknS] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...
常用參數:
-u	以指定使用者運作指令
-g	以指定主要組群運作指令
-n	防止提示使用者輸入密碼
           

範例:檢視目前使用者有哪些被sudo服務授權的指令

[[email protected] ~]# sudo -l
Matching Defaults entries for root on Rocky8:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
    env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
    env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User root may run the following commands on Rocky8:
    (ALL) ALL
[[email protected] ~]# su - jett
Last login: Sat Feb  4 10:42:24 CST 2023 on pts/0
[[email protected] ~]$ sudo -l
[sudo] password for jett: 
Sorry, user jett may not run sudo on Rocky8.  #使用者jett不在sudoers檔案中。
[[email protected] ~]$ su - root
Password: 
Last login: Sat Feb  4 10:43:56 CST 2023 on pts/0
[[email protected] ~]# visudo      #visudo指令自動調用vi編輯器來配置/etc/sudoers權限檔案
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
jett    ALL=(ALL)       ALL   #格式:誰可以使用 允許使用的主機 = (以誰的身份) 可執行指令的清單,注意要寫在root後面。
## Allows members of the 'sys' group to run networking, software,
[[email protected] ~]# su - jett    #切換至指定的普通使用者身份,此時就可以用sudo -l指令檢視所有可執行的指令了
Last login: Sat Feb  4 10:46:54 CST 2023 on pts/0
[[email protected] ~]$ sudo -l
[sudo] password for jett: 輸入切換至指定的普通使用者的密碼
Matching Defaults entries for jett on Rocky8:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
    env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
    env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User jett may run the following commands on Rocky8:
    (ALL) ALL
[[email protected] ~]$ ls /root   #普通使用者不能看到root管理者的家目錄
ls: cannot open directory '/root': Permission denied
[[email protected] ~]$ sudo ls /root  #sudo授權之後之後就可了
anaconda-ks.cfg

           

範例:visudo指令授予指定使用者特定權限

授權原則:在保證普通使用者完成相應工作的前提下,盡可能少地賦予額外的權限。

[[email protected] ~]# visudo      #visudo指令自動調用vi編輯器來配置/etc/sudoers權限檔案
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL   #添加的授權使用者注意要寫在root後面
jett    ALL=(ALL)       ALL   #格式:誰可以使用 允許使用的主機 = (以誰的身份) 可執行指令的清單
## Allows members of the 'sys' group to run networking, software,

可執行指令的清單的ALL參數允許某個普通使用者擁有整個系統中所有指令的最高執行權,這非常危險也不滿足授權原則,是以應該讓某個使用者隻能使用root管理者的身份執行指定的指令。
[[email protected] ~]$ exit    #退出目前終端
logout
[[email protected] ~]# whereis cat    #需要指令的絕對路徑否則系統會識别不出來
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[[email protected] ~]# whereis touch  #需要指令的絕對路徑否則系統會識别不出來
touch: /usr/bin/touch /usr/share/man/man1/touch.1.gz /usr/share/man/man1p/touch.1p.gz
[[email protected] ~]# visudo #添加/usr/bin/cat,/usr/bin/touch如下位置,多個指令檔案之間用逗号“,”間隔
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

jett    ALL=(ALL)       ALL /usr/bin/cat,/usr/bin/touch

## Allows members of the 'sys' group to run networking, software,
儲存退出後有如下螢幕顯示
>>> /etc/sudoers: syntax error near line 102 <<<
What now? 
Options are:
  (e)dit sudoers file again      #(e) 再次編輯sudoers檔案
  e(x)it without saving changes to sudoers file   #e(x)它不儲存對sudoers檔案的更改
  (Q)uit and save changes to sudoers file (DANGER!)  #(Q) 将更改送出并儲存到sudoers檔案(危險!)

What now? Q
[[email protected] ~]# su - jett
Last login: Sat Feb  4 11:02:58 CST 2023 on pts/0
[[email protected] ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[[email protected] ~]$ sudo cat /etc/shadow   #此時顯示文法錯誤,而指令visudo -c可以檢查/etc/sudoers檔案的文法錯誤、所有者和模式
>>> /etc/sudoers: syntax error near line 102 <<<
sudo: parse error in /etc/sudoers near line 102
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
[[email protected] ~]$ su - root
Password: 
Last login: Sat Feb  4 10:54:59 CST 2023 on pts/0
[[email protected] ~]# visudo -c     #檢查文法出錯,在102行
>>> /etc/sudoers: syntax error near line 102 <<<
parse error in /etc/sudoers near line 102
[[email protected] ~]# visudo  #在102行處,進行如下修改,顯示行号:set nu,儲存退出:wq
>>> /etc/sudoers: syntax error near line 102 <<<
  99 ## Allow root to run any commands anywhere
    100 root    ALL=(ALL)       ALL
    101 
    102 jett    ALL=(ALL)       /usr/bin/cat,/usr/bin/touch
    103 
    104 ## Allows members of the 'sys' group to run networking, software,
[[email protected] ~]# visudo -c   #再次檢查文法,文法OK
/etc/sudoers: parsed OK
[[email protected] ~]# su - jett
Last login: Sat Feb  4 11:30:02 CST 2023 on pts/0
[[email protected] ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[[email protected] ~]$ sudo cat /etc/shadow  
[sudo] password for jett:     #每次執行sudo指令都要輸入一次密碼挺麻煩的,可以添加NOPASSWD參數
root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
.....................省略部分資訊........................
[[email protected] ~]$ su - root
[[email protected] ~]# visudo
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

jett    ALL=(ALL)       NOPASSWD:/usr/bin/cat,/usr/bin/touch  #添加NOPASSWD參數,就不用每次輸入密碼了

## Allows members of the 'sys' group to run networking, software,

[[email protected] ~]# visudo -c
/etc/sudoers: parsed OK
[[email protected] ~]# su - jett     #添加NOPASSWD參數,就不用每次輸入密碼了
Last login: Sat Feb  4 11:40:32 CST 2023 on pts/0
[[email protected] ~]$ sudo cat /etc/passwd|head -3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

           

範例:使用sudoedit指令可以以另外一個使用者身份編輯檔案

[[email protected] ~]$ su -root
[[email protected] ~]# visudo
99 ## Allow root to run any commands anywhere
    100 root    ALL=(ALL)       ALL
    101 
    102 jett    ALL=(ALL)       ALL
    103 
    104 ## Allows members of the 'sys' group to run networking, software,
[[email protected] ~]# su - jett
Last login: Sat Feb  4 11:46:31 CST 2023 on pts/0
[[email protected] ~]$ sudoedit -u root /etc/shadow   #使用sudoedit指令可以以另外一個使用者身份編輯檔案,
[sudo] password for jett: 
sudoedit: /etc/shadow unchanged
#可以看出如果給予普通使用者最高權限後果非常嚴重,是以要遵守授權原則
           

2,檔案權限

對檔案設定一定存取權限,是一種常用的檔案保護方法,Linux系統中對檔案的通路者或者使用者進行分類識别{檔案主(owner)、檔案主的同組使用者(group)、其它使用者(other)},所有人包括屬主屬組和其它使用者就是all|a,對檔案操作權限也進行了分類識别{讀操作(read|r)、寫操作(write|w)、執行操作(execute|x)、不能執行任何操作(-)}。每一個屬性與檔案屬性的一個二進制位相對應,如果該存取權限設定了,對應的二進制位就是1,反之,就是0,是以使用8進制表示就是讀r=4、寫w=2、執行x=1。

《Linux基礎三》使用者和檔案權限管理使用者和檔案權限管理1,使用者2,檔案權限3,特殊檔案權限SUID 、SGID、 SBID4,隐藏檔案權限chattr、lsattr5,檔案通路控制清單ACL
#檔案權限指派寫法,在指令中的字元
+ 增加某些權限
- 删除某些權限
= 隻保留某些權限,覆寫寫法
#常用寫法
u+r #屬主加讀權限
g-x #屬組去掉執行權限
ug=rx #屬主屬組權限改為讀和執行
o= #other使用者無任何權限
a=rwx #所有使用者都有讀寫執行權限

#注意:
1)使用者的最終權限,是從左向右進行順序比對,即,所有者,所屬組,其他人,一旦比對權限立即生效,不再向右檢視其權限
2)r和w權限對root 使用者無效,對沒有讀寫權限的檔案,root使用者也可讀可寫
3)隻要所有者,所屬組或other三者之一有x權限,root就可以執行
           

Linux采用樹形目錄結構,凡是得到某級目錄的使用者就可以得到該級目錄所屬的全部目錄和檔案,按目錄中規定的存取權限使用目錄或檔案。

《Linux基礎三》使用者和檔案權限管理使用者和檔案權限管理1,使用者2,檔案權限3,特殊檔案權限SUID 、SGID、 SBID4,隐藏檔案權限chattr、lsattr5,檔案通路控制清單ACL

2.1 檔案權限檢視ls -l

由于對檔案主、組和其它使用者都有讀、寫、執行的權限設定,是以每個檔案共有9個權限參數,通過指令“ls -l”就能看到各個檔案的權限設定,檔案的權限設定在列出的資料中的第一列顯示。

《Linux基礎三》使用者和檔案權限管理使用者和檔案權限管理1,使用者2,檔案權限3,特殊檔案權限SUID 、SGID、 SBID4,隐藏檔案權限chattr、lsattr5,檔案通路控制清單ACL

第一列中的第1個位置表示檔案類型:Linux 系統中的檔案類型辨別符

檔案類型 辨別符 說明
普通檔案 -
目錄檔案 d directory
符号連結檔案 l link
塊裝置檔案 b b:block device,随機通路
字元裝置檔案 c c:character device,線性通路
管道檔案 p pipe
套接字檔案 s socket

第一列第2-4個位置表示屬主的權限;

第一列第5-7個位置表示屬組的權限;

第一列第8-10個位置表示其它使用者的權限;

2.2 改變檔案或目錄的使用者和使用者組chown

chown更改每個給定檔案的使用者和/或組所有權。

#文法
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
#用法說明
OWNER #隻修改所有者
OWNER:GROUP #同時修改所有者和屬組
:GROUP #隻修改屬組,冒号也可用 . 替換


#常用選項
-c|--changes #同-v選項,但隻顯示更新成功的資訊
-f|--silent|--quiet #不顯示錯誤資訊
-v|--verbose #顯示過程
--dereference #修改的是符号連結指向的檔案,而不是連結檔案本身
-h|--no-dereference #修改的是符号連結檔案,而不是其指向的目标檔案(隻有目前系統支援修改符号連結檔案屬性時,此項才有效)
--from=user:group #根據原屬主屬組來修改,相當于一個查詢條件
--no-preserve-root #不特别對待“/”,意思就是将根目錄當成普通目錄來執行,預設如此,是以不要對根目錄進行操作
--preserve-root #不允許在"/"上遞歸操作
--reference=RFILE #根據其它檔案權限來操作,就是複制該檔案的屬主屬組資訊給指定檔案
-R|--recursive #遞歸操作

#下列選項配合 -R 使用
-H #如果參數是指向目錄的軟連結,則隻修改指向的目錄,不改變目錄裡面檔案的
屬主屬組
-L #更改所有遇到的符号連結指向的目錄
-P #不更改符号連結指向的目錄
           

範例:

[[email protected] ~]# useradd usertest1
[[email protected] ~]# useradd usertest2
[[email protected] ~]# getent passwd usertest1 usertest2
usertest1:x:6694:6696::/home/usertest1:/bin/bash
usertest2:x:6695:6697::/home/usertest2:/bin/bash
[[email protected] ~]# groupadd grouptest1
[[email protected] ~]# groupadd grouptest2
[[email protected] ~]# getent group grouptest1 grouptest2
grouptest1:x:6698:
grouptest2:x:6699:
[[email protected] ~]# touch f{1..5}
[[email protected] ~]# ll f*
-rw-r--r-- 1 root root       0 Feb  2 22:03 f1
-rw-r--r-- 1 root root       0 Feb  2 22:03 f2
-rw-r--r-- 1 root root       0 Feb  2 22:03 f3
-rw-r--r-- 1 root root       0 Feb  2 22:03 f4
-rw-r--r-- 1 root root       0 Feb  2 22:03 f5
-rwxrwxrwx 1 root root 3918756 Jan 31 14:59 file1
-rw-r--r-- 1 root root      10 Jan 29 22:42 file2
[[email protected] ~]# chown usertest1 f1    #隻改變檔案屬主
[[email protected] ~]# chown :grouptest1 f1  #隻改變檔案屬組
[[email protected] ~]# chown usertest2:grouptest2 f2  #即改變檔案屬主同時改變檔案屬組
[[email protected] ~]# chown 6694:6699 f3    #以UID、GID修改
[[email protected] ~]# chown -R usertest2:grouptest2 data/
[[email protected] ~]# ll f1 f2 f3 data/    #改變指定目錄及其内所有子檔案的所屬主與所屬組
-rw-r--r-- 1 usertest1 grouptest1  0 Feb  2 22:03 f1
-rw-r--r-- 1 usertest2 grouptest2  0 Feb  2 22:03 f2
-rw-r--r-- 1 usertest1 grouptest2  0 Feb  2 22:03 f3

data/:
total 0
drwxr-xr-x 3 usertest2 grouptest2 23 Jan 31 11:10 test
[[email protected] ~]# chown --reference=f3 f4  # 根據其它檔案的屬主屬組同步給自己檔案的屬主屬組
[[email protected] ~]# ll f3 f4
-rw-r--r-- 1 usertest1 grouptest2 0 Feb  2 22:03 f3
-rw-r--r-- 1 usertest1 grouptest2 0 Feb  2 22:03 f4

           

2.3 更改檔案所屬使用者組chgrp

chgrp指令來自于英文詞組”change group“的縮寫,隻能更改檔案所屬使用者組。

#文法:
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
#常用選項
-c|--changes #同-v選項,但隻顯示更新成功的資訊
-f|--silent|--quiet #不顯示錯誤資訊
-v|--verbose #顯示過程
--dereference #修改的是符号連結指向的檔案,而不是連結檔案本身
-h|--no-dereference #修改的是符号連結檔案,而不是其指向的目标檔案(隻有目前系統支援修改符号連結檔案屬性時,此項才有效)
--no-preserve-root #不特别對待“/”,意思就是将家目錄當成普通目錄來執行,預設如此,是以不要對根目錄進行操作
--preserve-root #不允許在"/"上遞歸操作
--reference=RFILE #根據其它檔案權限來操作,就是複制該檔案的屬主屬組資訊給指定檔案
-R|--recursive #遞歸操作


#下列選項配合 -R 使用,
-H #如果參數是指向目錄的軟連結,則隻修改指向的目錄,不改變目錄裡面檔案的
屬主屬組
-L #更改所有遇到的符号連結指向的目錄
-P #不更改符号連結指向的目錄
           

範例:

[[email protected] ~]# ll f4 data/
-rw-r--r-- 1 usertest1 grouptest2   0 Feb  2 22:03 f4

data/:
total 0
drwxr-xr-x 3 usertest2 grouptest2 23 Jan 31 11:10 test
[[email protected] ~]# chgrp usertest1 f4  #更改檔案所屬使用者組為新的指定身份資訊
[[email protected] ~]# chgrp -R usertest1 data/   #更改目錄及其下所有檔案的所屬使用者組為新的指定身份資訊
[[email protected] ~]# ll f4 data/
-rw-r--r-- 1 usertest1 usertest1  0 Feb  2 22:03 f4

data/:
total 0
drwxr-xr-x 3 usertest2 usertest1 23 Jan 31 11:10 test

           

範例:

[[email protected] ~]# ln -s f1 f1.link
[[email protected] ~]# ll f1.link 
lrwxrwxrwx 1 root root 2 Feb  2 23:29 f1.link -> f1
[[email protected] ~]# chgrp group1 --no-dereference  f1.link  #修改f1.link 本身的屬組
[[email protected] ~]# ll f1.link 
lrwxrwxrwx 1 root group1 2 Feb  2 23:29 f1.link -> f1

[[email protected] ~]# ll f1
-rw-r--r-- 1 usertest1 group1 0 Feb  2 22:03 f1
[[email protected] ~]# chgrp grouptest2 --dereference  f1.link #修改f1.link所指向的屬組
[[email protected] ~]# ll f1
-rw-r--r-- 1 usertest1 grouptest2 0 Feb  2 22:03 f1

           

2.4 改變檔案或目錄權限chmod

chmod指令來自于英文詞組”change mode“的縮寫,其功能是用于改變檔案或目錄權限的指令。預設隻有檔案的所有者和管理者可以設定檔案權限,普通使用者隻能管理自己檔案的權限屬性。設定權限時可以使用數字法,亦可使用字母表達式。

#文法:
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

#字母表達式,#MODE
who opt permisson
who # u|g|o|a
opt # +|-|=
permission # r|w|x

#常用選項
-c|--changes #同-v選項,但隻顯示更新成功的資訊
-f|--silent|--quiet #不顯示錯誤資訊
-v|--verbose #顯示過程
--no-preserve-root #不特别對待“/”,意思就是将家目錄當成普通目錄來執行,預設如此,是以不要對根目錄進行操作
--preserve-root #不允許在"/"上遞歸操作
--reference=RFILE #根據其它檔案權限來操作,就是複制該檔案的權限資訊給指定檔案
-R|--recursive #遞歸操作
           

範例:字母表達法修改權限

[[email protected] ~]# touch file{1..5}
[[email protected] ~]# ll 
total 0
drwxr-xr-x 3 usertest2 usertest1 18 Jan 31 11:10 data
-rw-r--r-- 1 root      root       0 Feb  2 23:59 file1
-rw-r--r-- 1 root      root       0 Feb  2 23:59 file2
-rw-r--r-- 1 root      root       0 Feb  2 23:59 file3
-rw-r--r-- 1 root      root       0 Feb  2 23:59 file4
-rw-r--r-- 1 root      root       0 Feb  2 23:59 file5
[[email protected] ~]# chmod  a= file1
[[email protected] ~]# chmod u=r,g=w,o=x file2
[[email protected] ~]# chmod u+w,g-x,o-r file3
[[email protected] ~]# chmod a=rwx file4
[[email protected] ~]# chmod ug=rx file5
[[email protected] ~]# ll
total 0
drwxr-xr-x 3 usertest2 usertest1 18 Jan 31 11:10 data
---------- 1 root      root       0 Feb  2 23:59 file1
-r---w---x 1 root      root       0 Feb  2 23:59 file2
-rw-r----- 1 root      root       0 Feb  2 23:59 file3
-rwxrwxrwx 1 root      root       0 Feb  2 23:59 file4
-r-xr-xr-- 1 root      root       0 Feb  2 23:59 file5

           

範例:數字法修改權限

[[email protected] ~]# chmod 640 file1
[[email protected] ~]# chmod 644 file2
[[email protected] ~]# chmod 755 file3
[[email protected] ~]# ll file1 file2 file3
-rw-r----- 1 root root 0 Feb  2 23:59 file1  #屬主可讀寫,屬組可讀,其它使用者無任何權限
-rw-r--r-- 1 root root 0 Feb  2 23:59 file2  #屬主可讀寫,屬組可讀,其它使用者可讀
-rwxr-xr-x 1 root root 0 Feb  2 23:59 file3  #屬主可讀寫,可執行,屬組可讀可執行,其它使用者可讀可執行

           

範例:

#設定某個目錄及其内子檔案任何人都可以讀取
[[email protected] ~]# chmod -R a+r data/
[[email protected] ~]# ll data/
total 0
drwxr-xr-x 3 usertest2 usertest1 23 Jan 31 11:10 test
#設定某個二進制指令檔案上新增SUID特殊權限位
[[email protected] ~]#chmod u+s /sbin/reboot
           

2.5 建立檔案或目錄預設權限umask

在linux 系統中,建立檔案或目錄,都有一個預設權限;權限掩碼是由3個八進制的數字所組成,将現有的存取權限減掉權限掩碼後,即可産生建立檔案時預設的權限,而umask指令可用來設定權限掩碼。

umask 值間接影響建立檔案和建立目錄的權限:

建立檔案:666-umask,按位對應相減,如果所得結果某位存在執行(奇數)權限,則該位+1;

建立目錄:777-umask

非特權使用者umask預設是 002

root的umask 預設是 022

持久儲存umask

全局設定: /etc/bashrc

使用者設定:~/.bashrc

#文法:umask [-p] [-S] [mode]   顯示或設定檔案權限掩碼
-S	以文字的方式來表示權限掩碼
-p	輸出的權限掩碼可直接作為指令來執行,如果省略 MODE 模式,以可重用為輸入的格式輸入
           

範例:

#使用指令”umask”檢視目前權限掩碼
[[email protected] ~]# umask
0022
[[email protected] ~]# umask -p
umask 0022
[[email protected] ~]# umask -s
-bash: umask: -s: invalid option
umask: usage: umask [-p] [-S] [mode]
[[email protected] ~]# umask -S
u=rwx,g=rx,o=rx

#使組使用者的寫權限,其他使用者的讀、寫和執行權限都被取消
[[email protected] ~]#umask u=, g=w, o=rwx
           

3,特殊檔案權限SUID 、SGID、 SBID

在Linux中,除了rwx 這三種常⻅的權限之外,還有三個特殊權限,分别是SUID、SGID與SBIT的特殊權限位,可以與一般權限同時使用,以彌補一般權限不能實作的功能。

SUID:字元表示為s,八進制表示為4,如果原屬主沒有可執行權限,再加SUID權限,則顯示為S
SGID:字元表示為s,八進制表示為2,如果原屬組沒有可執行權限,再加SGID權限,則顯示為S
SBIT:字元表示為t,八進制表示為1,如果other沒有可執行權限,再加STICKY Bit權限,則顯示為T
           

chmod指令設定特殊權限的參數

#參數  作用
u+s	設定SUID權限
u-s	取消SUID權限
g+s	設定SGID權限
g-s	取消SGID權限
o+t	設定SBIT權限
o-t	取消SBIT權限
#SUID/SGID/SBIT權限設定和rwx差不多,也有兩種方式,一種是以字元,一種是以數字。
4 為 SUID = u+s
2 為 SGID = g+s
1 為 SBIT = o+t
           

SUID權限

Set UID,簡稱為SUID,僅對擁有執行權限的二進制程式有效,這個SUID不能放到目錄上,也不能用在腳本上(script),放上也是無效的。能夠讓二進制程式的執行者臨時擁有所有者的權限,是以,千萬不要将SUID權限設定到vim、cat、rm等指令上面。

[[email protected] ~]# ll /etc/shadow
---------- 1 root root 1669 Feb  2 23:19 /etc/shadow
[[email protected] ~]# ll /bin/passwd    #當s這個标志出現在檔案所有者的x權限上時,則就被稱為Set UID
-rwsr-xr-x. 1 root root 33424 Apr 20  2022 /bin/passwd
#使用者的登入密碼是存放在/etc/shadow的檔案中的,而這個檔案的權限是“全0”,除了root使用者能修改密碼外,普通使用者自己同樣也能修改密碼,為什麼沒有寫入權限,還能修改密碼,就是因為這個SUID功能,當某個使用者執行/bin/passwd指令的時候,就擁有了root的權限了。
           

SUID權限設定:

chmod u+s FILE…

chmod 4xxx FILE

chmod u-s FILE…

[[email protected] ~]# whoami
root
[[email protected] ~]# su jett
[[email protected] root]$ whoami
jett
[[email protected] root]$ cat /etc/shadow   #普通使用者無法檢視密碼檔案
cat: /etc/shadow: Permission denied
[[email protected] root]$ ll /bin/cat
-rwxr-xr-x 1 root root 38352 Sep 30 15:31 /bin/cat
[[email protected] root]$ chmod u+s /bin/cat   #普通使用者不能設定suid權限
chmod: changing permissions of '/bin/cat': Operation not permitted
[[email protected] root]$ su root
Password: 
[[email protected] ~]# chmod u+s /bin/cat #添加suid權限之後有了root權限了
[[email protected] ~]# su jett
[[email protected] root]$ ll /bin/cat
-rwsr-xr-x 1 root root 38352 Sep 30 15:31 /bin/cat
[[email protected] root]$ cat /etc/shadow |head -5  #有suid權限之後可以檢視了
root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
adm:*:18700:0:99999:7:::
lp:*:18700:0:99999:7:::
[[email protected] root]$ 
           

SGID權限

Set GID,簡稱為SGID,SGID特殊權限有兩種應用場景:當對二進制程式進行設定時,能夠讓執行者臨時擷取檔案所屬組的權限;當對目錄進行設定時,則是讓目錄内新建立的檔案自動繼承該目錄原有使用者組的名稱。

SGID權限設定:

chmod g+s DIR...
chmod 2xxx DIR
chmod g-s DIR...
           
[[email protected] ~]# useradd usertest
[[email protected] ~]# groupadd grouptest
[[email protected] ~]# mkdir datatest
[[email protected] ~]# chown usertest:grouptest datatest/
[[email protected] ~]# ll -d datatest/
drwxr-xr-x 2 usertest grouptest 23 Feb  3 22:24 datatest/
[[email protected] ~]# chmod g+s datatest/  #為目錄設定了SGID特殊權限位後,在此目錄下建立新檔案,則新檔案的群組與此目錄的群組相同。
[[email protected] ~]# touch datatest/testfile88 
[[email protected] ~]# ll datatest/testfile88   #建立檔案屬組變成了目錄屬組
-rw-r--r-- 1 root grouptest 0 Feb  3 22:27 datatest/testfile88
           

SBIT

Sticky Bit,簡稱SBIT,目前隻針對目錄有效,SBIT對檔案不起作用,針對others來設定的,對于目錄的作用是:當使用者在該目錄下建立檔案或目錄時,僅有自己與 root才有權力删除。

Sticky權限設定:

chmod o+t DIR…

chmod 1xxx DIR

chmod o-t DIR…

最具有代表的就是/tmp目錄,任何人都可以在/tmp内增加、修改檔案(因為權限全是rwx),但僅有該檔案/目錄建立者與 root能夠删除自己的目錄或檔案。

[[email protected] tmp]$ file /tmp   #檢視目錄中的sticky權限
/tmp: sticky, directory
[[email protected] ~]# ls -ald /tmp
drwxrwxrwt. 8 root root 105 Feb  3 22:27 /tmp  #目錄被設定SBIT特殊權限位後,檔案的其他使用者權限部分的x執行權限就會被替換成t或者T—原本有x執行權限則會寫成t,原本沒有x執行權限則會被寫成T
[[email protected] ~]# cd /tmp
[[email protected] tmp]# touch test
[[email protected] tmp]# chmod 777 test
[[email protected] tmp]# ll -a test 
-rwxrwxrwx 1 root root 0 Feb  3 22:41 test
[[email protected] tmp]# su jett
[[email protected] tmp]$ rm -rf /tmp/test   
rm: cannot remove '/tmp/test': Operation not permitted

           

4,隐藏檔案權限chattr、lsattr

Linux系統中的檔案除了具備一般權限和特殊權限之外,還有一種隐藏權限,即被隐藏起來的權限,預設情況下不能直接被使用者發覺。隐藏權限的專用設定指令是chattr,專用檢視指令是lsattr,使用正常的ls指令是不能看到的。

4.1 chattr指令

#文法:
chattr [ -RVf ] [ -v version ] [ -p project ] [ mode ] files...

#常用選項
-p project #設定檔案項目編号
-R #遞歸執行
-V #顯示過程,并輸出chattr 版本
-f #不輸出錯誤資訊
-v version #設定版本
#操作符
+attribute #添加該屬性
-attribute #去掉該屬性
=attribute #僅有該屬性
#常用屬性
a     #對檔案:可追加内容,不可被删除,不可被修改,不可被重命名;對目錄,可建立,修改檔案,但不可删除檔案
A     #不更新atime,節省IO
c     #檔案會被壓縮儲存
i     #對檔案:不可被删除不可被修改不可重命名;對目錄:可修改檢視目錄中的檔案,不可建立檔案,不可删除檔案
s     #徹底删除檔案,用0填充原來的資料塊
u     #防止誤删除,這裡是指原來存儲該檔案的塊不會被新的資料覆寫
           

範例:

[[email protected] ~]# echo "for Test" > testfile
[[email protected] ~]# chattr +a testfile   #設定了“不允許删除與覆寫”(+a參數)權限無法删除
[[email protected] ~]# rm -rf testfile 
rm: cannot remove 'testfile': Operation not permitted
[[email protected] ~]# lsattr testfile  #lsattr顯示檔案特殊屬性
-----a-------------- testfile


           

4.2 lsattr指令

在Linux系統中,檔案的隐藏權限必須使用lsattr指令來檢視,平時使用的ls之類的指令是看不到的,lsattr指令英文全稱為“list attributes”。

範例:

[[email protected] ~]# echo "abcd">test.txt
[[email protected] ~]# chattr +i test.txt  # +i 防止誤删除
[[email protected] ~]# ll -a test.txt 
-rw-r--r-- 1 root root 5 Dec  4 12:47 test.txt
[[email protected] ~]# lsattr test.txt  #lsattr顯示檔案特殊屬性
----i--------------- test.txt
[[email protected] ~]# rm -f test.txt    #不咳删除
rm: cannot remove 'test.txt': Operation not permitted
[[email protected] ~]# echo "123456" > test.txt  #不可寫入
bash: test.txt: Operation not permitted
[[email protected] ~]# echo "123456" >> test.txt  #不可追加
bash: test.txt: Operation not permitted
[[email protected] ~]# mv test.txt /tmp  #不可移動
mv: cannot move 'test.txt' to '/tmp/test.txt': Operation not permitted
[[email protected] ~]# cp test.txt /tmp   #可以複制
[[email protected] ~]# ll /tmp/test.txt 
-rw-r--r-- 1 root root 5 Dec  4 12:51 /tmp/test.txt
[[email protected] ~]# cat test.txt   #可讀
abcd

           

5,檔案通路控制清單ACL

Access Control List(通路控制清單),簡稱ACL,在 Linux 系統中, ACL 可實作對單一使用者也可以針對某個組設定通路檔案的權限。

ACL生效順序:所有者->自定義使用者->所屬組|自定義組->其他人

ACL權限的設定都是立即且永久生效的,會覆寫掉檔案原始的權限資訊,是以要小心謹慎,不好找回之前設定,設定ACL權限的時候最好備份一下原始檔案的ACL權限設定。

《Linux基礎三》使用者和檔案權限管理使用者和檔案權限管理1,使用者2,檔案權限3,特殊檔案權限SUID 、SGID、 SBID4,隐藏檔案權限chattr、lsattr5,檔案通路控制清單ACL

顯示檔案的ACL權限getfacl

getfacl指令用于檢視檔案的ACL權限規則,英文全稱為“get files ACL”

#文法:
getfacl [-aceEsRLPtpndvh] file ...
getfacl [-aceEsRLPtpndvh] -

           

範例:檢視檔案是否設定了ACL,隻需要看檔案屬性第一列的點“.”變成了加号“+”。

[[email protected] ~]# ls -ld /root   #檢視檔案是否設定了ACL,隻需要看檔案屬性第一列的點“.”變成了加号“+”。
dr-xrwx---+ 2 root root 151 Dec  4 12:07 /root
[[email protected] ~]# ls -ld /etc
drwxr-xr-x. 94 root root 8192 Feb  4 11:52 /etc

           

範例:檢視檔案的ACL權限規則

[[email protected] ~]# getfacl /etc/fstab 
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
other::r--

[[email protected] ~]#
           

設定檔案的ACL權限setfacl

setfacl指令用于管理檔案的ACL權限規則,英文全稱為“set files ACL”。

#文法
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file...
setfacl --restore=file

#常用選項
-m|--modify=acl #修改acl權限
-M|--modify-file=file #從檔案讀取規則
-x|--remove=acl #删除檔案acl 權限
-X|--remove-file=file #從檔案讀取規則
-b|--remove-all #删除檔案所有acl權限
-k|--remove-default #删除預設acl規則
--set=acl #用新規則替換舊規則,會删除原有ACL項,用新的替代,一定要包含UGO的設定,不能象 -m一樣隻有 ACL
--set-file=file #從檔案讀取新規則
--mask #重新計算mask值
-n|--no-mask #不重新計算mask值
-d|--default #在目錄上設定預設acl
-R|--recursive #遞歸執行
-L|--logical #将acl 應用在軟連結指向的目标檔案上,與-R一起使用
-P|--physical #将acl 不應用在軟連結指向的目标檔案上,與-R一起使用
           

範例:普通使用者單獨設定一下檔案通路權限ACL

[[email protected] ~]# ls -ld /root  #檢視檔案是否設定了ACL,隻需要看檔案屬性第一列的點“.”變成了加号“+”。
dr-xrwx---+ 2 root root 151 Dec  4 12:07 /root
[[email protected] ~]# ls -ld /etc
drwxr-xr-x. 94 root root 8192 Feb  4 11:52 /etc

[[email protected] ~]# su - jett
Last login: Sat Feb  4 11:52:32 CST 2023 on pts/0
[[email protected] ~]$ cd /root      #普通使用者無法進入/root目錄中
-bash: cd: /root: Permission denied
[[email protected] ~]$ su -
Password: 
Last login: Sat Feb  4 12:10:34 CST 2023 on pts/0
[[email protected] ~]# setfacl -Rm u:jett:rwx /root  #普通使用者單獨設定一下檔案通路權限ACL就可以了
[[email protected] ~]# su - jett
Last login: Sat Feb  4 12:13:46 CST 2023 on pts/0
[[email protected] ~]$ cd /root
[[email protected] root]$ ls
anaconda-ks.cfg

           

範例:

[[email protected] ~]# ll /etc/shadow
----rw----+ 1 root root 976 Dec  4 13:03 /etc/shadow
[[email protected] ~]# setfacl -m g:jett:rw /etc/shadow   #允許某個組的使用者都可以讀寫/etc/shadow檔案
[[email protected] ~]# getfacl /etc/shadow
getfacl: Removing leading '/' from absolute path names
# file: etc/shadow
# owner: root
# group: root
user::---
group::---
group:jett:rw-  #運作jett組使用者讀寫操作
mask::rw-
other::---

[[email protected] ~]# 
[[email protected] ~]# ll /etc/shadow   #檔案屬性第一列的點“.”變成了加号“+”表示設定了ACL
----rw----+ 1 root root 976 Dec  4 13:03 /etc/shadow

[[email protected] ~]# su - jett
Last login: Sat Feb  4 12:15:44 CST 2023 on pts/0
[[email protected] ~]$ cat /etc/shadow
root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
.........................省略部分資訊...................................
[[email protected] ~]# setfacl -x g:jett /etc/shadow  #選項-x删除特定ACL權限,-b清空ACL
[[email protected] ~]# getfacl /etc/shadow
getfacl: Removing leading '/' from absolute path names
# file: etc/shadow
# owner: root
# group: root
user::---
group::---
mask::---
other::---

           

備份ACL權限

[[email protected] ~]# cd /
[[email protected] /]# getfacl -R etc/ > ~/backupetc.ACL   #getfacl在備份目錄權限時必須先切換到備份目錄的上一層目錄,不能使用絕對路徑的形式,參數-R目錄本身及其檔案的權限自動備份。
[[email protected] /]# cd
[[email protected] ~]# ll backupetc.ACL 
-rw-r--r-- 1 root root 67556 Feb  4 12:58 backupetc.ACL
[[email protected] ~]# cat backupetc.ACL | head 
# file: etc/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

# file: etc//fstab
# owner: root
# group: root
[[email protected] ~]# setfacl --restore backupetc.ACL 
setfacl: etc/: No such file or directory
setfacl: etc//fstab: No such file or directory
.........省略部分資訊................
[[email protected] ~]# cd /    #ACL權限的恢複時同樣需要切換到恢複檔案的上一層目錄
[[email protected] /]# setfacl --restore ~/backupetc.ACL 
[[email protected] /]# 
           

root

[[email protected] root]$ ls

anaconda-ks.cfg

範例:

```bash
[[email protected] ~]# ll /etc/shadow
----rw----+ 1 root root 976 Dec  4 13:03 /etc/shadow
[[email protected] ~]# setfacl -m g:jett:rw /etc/shadow   #允許某個組的使用者都可以讀寫/etc/shadow檔案
[[email protected] ~]# getfacl /etc/shadow
getfacl: Removing leading '/' from absolute path names
# file: etc/shadow
# owner: root
# group: root
user::---
group::---
group:jett:rw-  #運作jett組使用者讀寫操作
mask::rw-
other::---

[[email protected] ~]# 
[[email protected] ~]# ll /etc/shadow   #檔案屬性第一列的點“.”變成了加号“+”表示設定了ACL
----rw----+ 1 root root 976 Dec  4 13:03 /etc/shadow

[[email protected] ~]# su - jett
Last login: Sat Feb  4 12:15:44 CST 2023 on pts/0
[[email protected] ~]$ cat /etc/shadow
root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
.........................省略部分資訊...................................
[[email protected] ~]# setfacl -x g:jett /etc/shadow  #選項-x删除特定ACL權限,-b清空ACL
[[email protected] ~]# getfacl /etc/shadow
getfacl: Removing leading '/' from absolute path names
# file: etc/shadow
# owner: root
# group: root
user::---
group::---
mask::---
other::---

           

備份ACL權限

[[email protected] ~]# cd /
[[email protected] /]# getfacl -R etc/ > ~/backupetc.ACL   #getfacl在備份目錄權限時必須先切換到備份目錄的上一層目錄,不能使用絕對路徑的形式,參數-R目錄本身及其檔案的權限自動備份。
[[email protected] /]# cd
[[email protected] ~]# ll backupetc.ACL 
-rw-r--r-- 1 root root 67556 Feb  4 12:58 backupetc.ACL
[[email protected] ~]# cat backupetc.ACL | head 
# file: etc/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

# file: etc//fstab
# owner: root
# group: root
[[email protected] ~]# setfacl --restore backupetc.ACL 
setfacl: etc/: No such file or directory
setfacl: etc//fstab: No such file or directory
.........省略部分資訊................
[[email protected] ~]# cd /    #ACL權限的恢複時同樣需要切換到恢複檔案的上一層目錄
[[email protected] /]# setfacl --restore ~/backupetc.ACL 
[[email protected] /]# 
           

mask權限**

使用者或群組能擁有的最大 ACL 權限

使用者設定的ACL與mask“按位相與”運算,最終得出的值才是使用者真正的ACL權限,也就是說給使用者或群組設定的 ACL 權限不能超過 mask 規定的權限範圍。

[[email protected] ~]# mkdir datatest
[[email protected] ~]# getfacl datatest/
# file: datatest/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

[[email protected] ~]# setfacl -m u:jett:rx datatest/
[[email protected] ~]# getfacl datatest/
# file: datatest/
# owner: root
# group: root
user::rwx
user:jett:r-x  #使用者jett對datatest/目錄的權限
group::r-x
mask::r-x     #mask權限,指的是使用者或群組能擁有的最大 ACL 權限
other::r-x
#對比添加 ACL權限前後getfacl指令的輸出資訊,發現設定了ACL權限之後多了使用者權限設定和mask權限設定。
#使用者設定的ACL與mask“按位相與”運算,r-x沒有超過mask的r-x權限,是以使用者jett對datatest/目錄具有r-x權限。