linux下權限管理
1.1、何為linux下用戶
在談論用戶之前,我們簡單的來說明一下單用戶單任務操作系統以及多用戶多任務操作系統。
簡單而言,單用戶單任務就是可以登錄操作系統的用戶一次只能是一個,而且一次只能執行一個任務;多用戶多任務操作系統就是一次登錄用戶可以有多個且同時也能執行多個任務。在計算機的發展歷程中,操作系統軟件是一個比較重要的概念,其中批處理的提出與實現,後來單核cpu的時間分片技術的提出與實現等等一切都與這個多任務有關系。在早些年間,計算機資源還是那麽的昂貴,如果給每個工作任務的人都配備一臺計算機的話,無疑是不可估量的成本,於是乎人們會把一臺計算機資源給多個人使用,多個扮演著不同角色的人可能就使用同一臺計算機資源,而linux下的用戶就代表著他們的一種身份,是一個標識,同時對底層使一個抽象的認證,其對應到對應的與計算機操作系統的第三方登錄應用程序。
1.2、何為linux下用戶組
上面我們已經講過,一臺計算機資源可能面對著不同的工作者。有時候為了分工明細,把一類具有統一工作性質或者有著同樣工種的人的賬戶劃分為一個組,就像今天現實生活中的大部分的概念一樣,比如你進入某個大學的某個系,某個系的某個專業的某個班級等等,這些劃分都可以算一個分類,分組或者叫分層的概念。(理解未必準確或者專業,為了方便理解,自己可以抽象出概念)。
1.3、linux下用戶分類和用戶組分類
有了用戶和組的基本概念之後,我們再來看看用戶和組的分類劃分以及相關標準。如今的linux操作系統可以算是"多用戶多任務"的操作系統。一次操作系統支持多個用戶的認證與登錄,可以同時處理多個任務,互不幹撓。
linux下的每個用戶都有一個名字,對應系統上有一個id,以及對應的密碼(我們暫且把空密碼也算一種密碼)),用來驗證,認證。而每個組也有對應的名字和id,組算是一個容器,每個用戶可以至少加入一個組等等。如果按照如今操作系統對用戶的劃分以及組的劃分,我們可以把用戶劃分為兩大類:一類是管理員用戶,一類是普通用戶,而普通用戶又可以劃分為系統用戶以及登錄用戶。而組也同樣可以抽象劃分成兩大類:一類是管理員組,一類是普通用戶組,而普通用戶組又可以劃分為系統組以及登錄組。用來表示用戶的id叫做UID(user identifier),用來表示組的id叫GID(group identifier)。
有了UID和GID的概念後,我們來看看Unix早期的設計邏輯。Unix系統的正常運作需要使用大量的與系統有關的數據庫文件,例如,口令文件/etc/passwd和組文件/etc/group就是經常被多個程序頻繁使用的兩個文件。用戶每次登陸Unix系統,以及每次執行ls -l命令都要使用口令文件。
條目id | 用戶分類 | UID值以及範圍 |
---|---|---|
1 | 管理員用戶 | 0 |
2 | 普通用戶 | 1~65535 |
條目id | 普通用戶分類 | UID值或範圍,CentOS 6系列為例 | UID值或範圍,CentOS 7系列為例 |
---|---|---|---|
1 | 系統用戶 | 1~499 | 1~999 |
2 | 登錄用戶 | 500~60000 | 1000~60000 |
條目id | 組分類 | GID值或範圍 |
---|---|---|
1 | 管理員組 | 0 |
2 | 普通用戶組 | 1~65535 |
條目id | 普通用戶組分類 | GID值或範圍,CentOS 6系列為例 | GID值或範圍,CentOS 7系列為例 |
---|---|---|---|
1 | 系統用戶組 | 1~499 | 1~999 |
2 | 登錄用戶組 | 500~60000 | 1000~60000 |
在我們正式介紹用戶配置文件之前,我們來簡單劃分一下加密算法的分類:
條目id | 加密算法 | 說明 | 附加 |
---|---|---|---|
1 | 對稱加密 | 加密與解密使用同一個密碼 | - |
2 | 非對稱加密 | 加密與解密使用一對秘鑰 | 密鑰對兒:公鑰(public key),私鑰(private key) |
3 | 單向加密 | 只能加密,不能加密。提取數據特征碼 | 加密定長輸出,滿足雪崩效應 |
條目id | 單向加密算法 | 常見的名字及特點 |
---|---|---|
1 | md5(message digest) | md5,128bits |
2 | sha(secure hash algorithm) | 160bits,sha224(224bits),sha256,sha384,sha512 |
1.4、配置文件說明
- 用戶信息庫文件(/etc/passwd)
簡單來看看格式:
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
......
用戶的信息配置文件大體格式如下:
name:password:UID:GID:GECOS:directory:shell
一共是以冒號(:)隔開的7列,具體含義是:
name:用戶的登錄用戶名;
password:可以是加密的密碼,也可以是占位符"*"或者"x";
UID:用戶標識id號;
GID:用戶的基本組(主組)id號;
GECOS:關於用戶的註釋信息;
directory:用戶的家目錄;
shell:用戶登錄shell的名字
- 用戶密碼影子文件(/etc/shadow)
簡單來看看格式:
[root@localhost ~]# cat /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::
cdrom:::
mail:::postfix
man:::
dialout:::
floppy:::
games:::
......
用戶密碼影子文件字段也是以符號":"隔開的,嚴格來說有9段,通常我們見到的可能只有幾段
login name:encrypted password:date of last password change:minimum password age:maximum password age:password warning period:password inactivity period:account expiration date:reserved field
用戶名:加密的密碼:最近一次修改密碼的時間:最短使用期限:最長使用期限:警告期段:密碼不活動期限:過期期限:保留字段
- 關於linux下用戶的生命周期的幾個時間段如下圖所示
- 組信息庫文件(/etc/group)
簡單來看看格式:
[root@localhost ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
...
group name:password:GID:user_list
組名:密碼:組id:組內用戶列表
group name: 表示組名字;
password:密碼占位符"x";
GID:組id;
user_list:以逗號隔開的屬於該組的用戶列表;
- 組密碼影子文件(/etc/gshadow)
簡單來看看格式:
[root@localhost ~]# cat /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::
cdrom:::
mail:::postfix
man:::
dialout:::
floppy:::
games:::
tape:::
video:::
ftp:::
lock:::
audio:::
nobody:::
users:::
utmp:!::
utempter:!::
input:!::
......
group name:encrypted passwd:administrators:members
group name:組名;
encrypted passwd:組認證密碼,如果為空或者"!"表示組沒有設置密碼;
administrators:組內管理者,如果有多個組是管理,用逗號分隔;
members:組內成員,多個用逗號分隔;
1.5、案例分析,示例環節
常用的命令有:
useradd(adduser):新增用戶或者更新已有用戶的屬性的命令;
語法結構:
useradd [options] USERNAME #創建用戶
useradd -D #顯示創建用戶默認配置
useradd -D [options] #修改用戶默認選項配置
主要選項:
-u, --uid UID:指定UID;
-g, --gid GROUP:指定基本組ID,此組得事先存在;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:指明用戶所屬的附加組,多個組之間用逗號分隔;
-c, --comment COMMENT:指明註釋信息;
-d, --home HOME_DIR:以指定的路徑為用戶的家目錄;通過復制/etc/skel此目錄並重命名實現;
指定的家目錄路徑。如果事先存在,則不會為用戶復制環境配置文件;
-s, --shell SHELL:指定用戶的默認shell,可用的所有shell列表存儲在/etc/shells文件中;
-r, --system:創建系統用戶;
userdel:刪除一個用戶和用戶相關聯的文件的命令;
語法結構:
userdel [options] USERNAME #刪除用戶
常用選項:
-r, --remove:刪除用戶時候一並刪除創建用戶時相關聯的幾個目錄(家目錄,郵件目錄等);
usermod:修改用戶的屬性的命令;
語法結構:
usermod [options] USERNAME #修改用戶屬性
常用選項:
-u, --uid UID:修改用戶的ID為此處指定的新UID;
-g, --gid GROUP:修改用戶所屬的基本組;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用戶所屬的附加組;原來的附加組會被覆蓋;
-a, --append:與-G一同使用,用於為用戶追加新的附加組;
-c, --comment COMMENT:修改註釋信息;
-d, --home HOME_DIR:修改用戶的家目錄;用戶原有的文件不會被轉移至新位置;
-m, --move-home:只能與-d選項一同使用,用於將原來的家目錄移動為新的家目錄;
-l, --login NEW_LOGIN:修改用戶名;
-s, --shell SHELL:修改用戶的默認shell;
-L, --lock:鎖定用戶密碼;即在用戶原來的密碼字符串之前添加一個"!";
-U, --unlock:解鎖用戶的密碼;
passwd:更新用戶認證信息的命令;
語法結構:
passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
簡化後常用結構:
passwd #不指定用戶名表示修改當前登錄用戶自己的密碼;
passwd USERNAME #修改指定用戶的密碼,僅管理員用戶修改其他用戶密碼
常用選項:
-l, -u:鎖定和解鎖用戶;
-d:清除用戶密碼串;
-e DATE: 過期期限,日期;
-i DAYS:非活動期限;
-n DAYS:密碼的最短使用期限;
-x DAYS:密碼的最長使用期限;
-w DAYS:警告期限;
--stdin:非交互式默認修改密碼,一般常用語腳本中
echo "PASSWORD" | passwd --stdin USERNAME
groupadd:新建組命令;
語法結構:
groupadd [options] GROUP_NAME #新建組
常用選項:
-g GID:指定GID;默認是上一個組的GID+1;
-r: 創建系統組;
groupdel:刪除組命令;
語法結構:
groupdel [options] GROUP_NAME
常用選項:
無,直接groupdel加組名就是常見的操作。
groupmod:修改系統定義的組屬性信息的命令;
語法結構:
groupmod [options] GROUP_NAME
常見選項:
-g GID:修改GID;
-n new_name:修改組名;
gpasswd:管理組的命令;
語法結構:
gpasswd [option] group_name
常用選項:
-a USERNAME:向組中添加用戶
-d USERNAME:從組中移除用戶
newgrp:臨時切換到一個組
語法結構:
newgrp [-] [group]
常用選項:
無,特別說明切換時加上符號"-"的含義:
-: 會模擬用戶重新登錄以實現重新初始化其工作環境
pwconv:creates shadow from passwd and an optionally existing shadow.
啟用/etc/passwd到/etc/shadow的投影,開啟用戶密碼映射到/etc/shadow;
特點:啟用後,/etc/passwd文件的第二列(前邊介紹過,以冒號分隔),有一個密碼占位符,加密後的密碼串
存放於用戶信息庫的影子文件/etc/shadow對應行的第二列。(安全)
pwunconv:creates passwd from passwd and shadow and then removes shadow.
關閉/etc/passwd到/etc/shadow的投影,關閉用戶密碼映射到/etc/shadow;
特點:關閉後,/etc/passwd文件的第二列將會直接存儲用戶密碼加密後的連接串(不安全),/etc/shadow文件
被臨刪除。/etc/passwd配置文件除了管理員之外,其他用戶也可讀,所以相對來說不安全;
grpconv:creates gshadow from group and an optionally existing gshadow
啟用/etc/group到/etc/gshadow的投影,開啟組密碼映射到/etc/gshadow;
特點:啟用後,/etc/group文件的第二列,有個密碼占位符,用戶組加密後的密碼串存放於組信息庫
的影子文件/etc/gshadow對應行的第二列(安全);
grpunconv:creates group from group and gshadow and then removes gshadow.
關閉/etc/group到/etc/gshadow的投影,關閉組密碼映射到/etc/gshadow;
特點:關閉後,/etc/group文件的第二列,會直接顯示加密後組的密碼連接串(不安全),/etc/gshadow文件
被臨時刪除。/etc/group配置文件除了管理員之外,其他用戶也可以讀,所以相對來說不安全;
###以上四個命令(pwconv,pwunconv,grpconv,grpunconv),與用戶信息文件與密碼影子文件映射關系的,直接操作:
COMMAND
finger:用戶信息查找的命令;
語法結構:
finger [-lmsp] [user ...] [user@host ...]
常用選項:
無,命令本身用的比較少,如果要用可以自行查閱手冊。一般是直接執行命令本身或命令加上一個或多個
用戶(空白字符分隔多個用戶)
chage:修改用戶密碼過期信息的命令;
語法結構:
chage [options] USERNAME
常用選項:
-d, --lastday LAST_DAY:設置用戶最進一次修改密碼的時刻;上一次更改用戶密碼的日期。
-E, --expiredate EXPIRE_DATE:設置用戶密碼過期時刻的日期;帳號到期的日期。過了這天,此帳號將被鎖定;
-W, --warndays WARN_DAYS:設置用戶密碼告警時間段的天數;用戶密碼到期前,提前收到警告信息的天數;
-m, --mindays MIN_DAYS:設置用戶密碼最短使用的天數;密碼可更改的最小天數。為零時代表任何時候都
可以更改密碼;
-M, --maxdays MAX_DAYS:設置用戶密碼最長使用的天數;密碼保持有效的最大天數。快到密碼過期時刻區間,
會在這個最長密碼使用天數的時間段內;
chsh:修改用戶登錄shell的命令;
語法結構:
chsh [-s shell] [-l] [-u] [-v] [username]
常用選項:
-s, --shell shell :修改用戶登錄shell;
-l, --list-shells:當用當前系統可用的shell,/etc/shells這個配置文件裏面的內容列表;
id:打印用戶真實的有效的用戶id和組id的命令;
語法結構:
id [OPTION]... [USERNAME]
一個用戶可以屬於多個組,每一個用戶都有一個UID;
每個組都有一個GID;
一個GID對應多個UID;
常用選項:
-g, --group:顯示用戶所屬群組(主要組)的ID;
-G, --groups:顯示用戶所屬附加群組(附加組)的ID;
-n, --name:顯示用戶,所屬群組或附加群組的名稱。一定要和-u,-g,-G選項可以一起使用;
-r, --real:打印真實的id而非有效的id,一定要與-ugG一起用;
-u, --user:打印有效的用戶id;
su:切換用戶運行命令的一個工具;(可以切換到其他用戶運行命令)
語法結構:
su [options...] [-] [user [args...]]
常用選項:
登錄式切換:會通過讀取目標用戶的配置文件來重新初始化
su - USERNAME
su -l USERNAME
非登錄式切換:不會讀取目標用戶的配置文件進行初始化
su USERNAME
註意:管理員可無密碼切換至其它任何用戶;(受到PAM機制的控制,默認機制如此)
-c ‘COMMAND‘:僅以指定用戶的身份運行此處指定的命令;
========================================================================
chmod:改變文件權限位的命令;
語法結構:
chmod [OPTION]... MODE[,MODE]... FILE... #指定修改修改方式
chmod [OPTION]... OCTAL-MODE FILE... #指定八進制權限修改方式
chmod [OPTION]... --reference=RFILE FILE... #參照引用修改權限方式
說明:
三類用戶:
u:屬主
g:屬組
o:其它
a: 所有
選項:
-R, --recursive:遞歸修改
第一種形式:
MODE表示法:
賦權表示法:直接操作一類用戶的所有權限位rwx;
u=
g=
o=
a=
授權表示法:直接操作一類用戶的一個權限位r,w,x;
u+, u-
g+, g-
o+, o-
a+, a-
第二種形式:
COTAL-MODE為八進制權限,例如660,775,600,400等;
第三種形式:
註意:用戶僅能修改屬主為自己的那些文件的權限
========================================================================
chown:改變文件從屬關系(用戶屬主和用戶屬組)的命令;
語法結構:
chown [OPTION]... [OWNER][[:|.][GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
常用選項:
-R:遞歸修改;
chgrp:改變組從屬關系(用戶屬組)的命令;
語法結構:
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
常用選項:
一般不會用這個命令。
註意:僅管理員可修改文件的屬主和屬組
umask:顯示或設置文件權限模型掩碼的命令;
常用選項:
-p:輸出的權限掩碼可直接作為指令來執行;
-S:以符號方式輸出權限掩碼。
說明:
文件:
666-umask
目錄:
777-umask
註意:之所以文件用666去減,表示文件默認不能擁有執行權限;
如果減得的結果中有執行權限,則需要將其加1;
umask: 023
666-023=644
777-023=754
umask命令:
umask:查看當前umask
umask MASK: 設置umask
install:復制文件並設置屬性的命令;
語法結構:
install [OPTION]... [-T] SOURCE DEST
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...
幾種形式,和cp,mv差不多,有多源,和單源復制;
常用選項:
-m, --mode=MODE:設定目標文件權限,默認為755;
-o, --owner=OWNER:設定目標文件屬主;
-g, --group=GROUP:設定目標文件屬組;
mktemp:創建臨時文件或臨時目錄的命令;
語法結構:
mktemp [OPTION]... [TEMPLATE]
常用選項:
-d:創建臨時目錄
-u, --dry-run:模擬跑一遍,不實際執行;(幹跑一遍)
--suffix=SUFF:在創建臨時文件的後綴標誌控制的後面再加上我們指定的後綴;
-p DIR, --tmpdir[=DIR]:指定創建臨時文件的目錄,默認是/tmp目錄;
註意:mktemp會將創建的臨時文件名直接返回,因此,可直接通過命令引用保存起來
說明:
安全的創建一個臨時文件或臨時目錄,並打印創建的文件或目錄的名字;
TEMPLATE控制標誌至少包含3個連續的符號‘X‘.默認省略這個標誌表示
采取這種形式:tmp.XXXXXXXXXX
# 案例一(新建用戶類)
新建一個用戶centos,屬性都采用默認值;
[root@localhost ~]# useradd centos
[root@localhost ~]# id centos
uid=1002(centos) gid=1002(centos) groups=1002(centos)
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# grep --color=auto ‘centos‘ /etc/passwd /etc/group /etc/shadow /etc/gshadow
/etc/passwd:centos:x:1002:1002::/home/centos:/bin/bash
/etc/group:centos:x:1002:
/etc/shadow:centos:!!:17783:0:99999:7:::
/etc/gshadow:centos:!::
說明:我拿我本地的centos 7系列的系統,創建流一個centos用戶,然後用id工具查看流該用戶的id相關的
屬性。然後利用grep過濾工具過濾了4個配置文件裏面對應存儲的信息。(/etc/passwd,/etc/shadow,/etc/group,
/etc/gshadow)。
有個系統配置文件定了默認用戶的屬性信息,這個配置文件是/etc/login.defs
[root@localhost ~]# ls -l /etc/login.defs
-rw-r--r--. 1 root root 2028 Nov 5 2016 /etc/login.defs
man手冊信息摘要指出該配置文件:shadow password suite configuration,含義是密碼影子配置文件的
默認配置。簡單來說,默認如果我們使用工具useradd來創建用戶,而用戶本身有許多屬性信息(比如用戶
的家目錄,用戶id,用戶組,登錄shell等等),這些屬性信息默認如果不用參數顯式的指明,我們的工具
就會套用默認配置文件配置。由於這個模板配置文件的內容較多:
[root@localhost ~]# wc -l /etc/login.defs
72 /etc/login.defs
我們這裏就簡單的列出其中幾處進行說明。
/etc/login.defs部分節選內容:
......
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail #指明定義用戶郵件目錄,該目錄下會默認創建一個同用戶名的配置文件
#MAIL_FILE .mail
......
# 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 #最大的密碼使用天數,數字99999幾乎算是永不過期;
PASS_MIN_DAYS 0 #最小的密碼使用天數,0表示隨時可以更改密碼,如果指定一個
天數,每一次修改一次密碼,最少密碼要使用這麽一段時間才能繼續修改用戶密碼。
PASS_MIN_LEN 5 #密碼最少接受的長度
PASS_WARN_AGE 7 #密碼過期前的警告時間天數,這個警告時間段內,用戶登錄一次,
會提示密碼快過期了。這個時間段,即使你不修改密碼,還是照樣可以登錄。如果過了這個時間
段,接下來是密碼過期截止時間段,有一個緩存區間,在賬戶被鎖定前,這個區間,你要修改密碼
才能登錄,實際密碼算是已經過期了。如果你繼續不該密碼,過了這個時間段,你的賬戶就被鎖定了;
......
# Min/max values for automatic uid selection in useradd
#
UID_MIN 1000
UID_MAX 60000
# System accounts
SYS_UID_MIN 201
SYS_UID_MAX 999
#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN 1000
GID_MAX 60000
# System accounts
SYS_GID_MIN 201
SYS_GID_MAX 999
上面這兩部分指定的是登錄用戶和系統用戶,以及登錄用戶組合系統用戶組的ID範圍;
# 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 #默認表示要創建用戶家目錄
# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077 #系統上默認創建文件時的掩碼值;
# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes #使用userdel刪除用戶的時候,如果對應用戶組沒有其他成員默認要刪除對應的組;
# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512 #加密密碼使用的單項加密算法是用的sha512
# 案例二(新建用戶組類)
創建一個用戶組叫gerror,並把我們之前創建的用戶centos加入到這個組(我們的centos有一個主組
默認是centos,讓gerror這個新建組屬於centos的附加組)。
[root@localhost ~]# groupadd gerror #創建gerror這個組
[root@localhost ~]# grep --color=auto ‘gerror‘ /etc/group /etc/gshadow #看看與組相關的配置文件裏面
是否包含gerror
/etc/group:gerror:x:1003:
/etc/gshadow:gerror:!::
[root@localhost ~]# id centos #把centos加入gerror組之前查看其歸屬id信息
uid=1002(centos) gid=1002(centos) groups=1002(centos)
[root@localhost ~]# usermod -G gerror centos #利用usermod修改用戶屬性,給centos添加一個附加組gerror
[root@localhost ~]# id centos #添加附加組之後,看看centos用戶的id後邊的變化,多了一個GID為1003的gerror組
uid=1002(centos) gid=1002(centos) groups=1002(centos),1003(gerror)
[root@localhost ~]# grep --color=always ‘centos‘ /etc/passwd /etc/shadow /etc/group /etc/gshadow
/etc/passwd:centos:x:1002:1002::/home/centos:/bin/bash
/etc/shadow:centos:!!:17783:0:99999:7:::
/etc/group:centos:x:1002:
/etc/group:gerror:x:1003:centos
/etc/gshadow:centos:!::
/etc/gshadow:gerror:!::centos
#這裏可以看出,我們的組相關的配置文件中gerror的對應用戶列表中多了一個centos用戶;
[root@localhost ~]# id centos
uid=1002(centos) gid=1002(centos) groups=1002(centos),1003(gerror)
[root@localhost ~]# id -u centos
1002
[root@localhost ~]# id -G centos
1002 1003
[root@localhost ~]# id -Gn centos
centos gerror
[root@localhost ~]# id -un centos
centos
# 案例三(修改用戶屬性類)
修改用戶centos的默認家目錄:
先看看我們的centos默認家目錄,默認應該是/home/username
[root@localhost ~]# grep ‘centos‘ /etc/passwd
centos:x:1002:1002::/home/centos:/bin/bash
[root@localhost ~]# ls -la /home/centos/
total 12
drwx------. 3 centos centos 78 Sep 10 07:10 .
drwxr-xr-x. 5 root root 47 Sep 10 07:10 ..
-rw-r--r--. 1 centos centos 18 Apr 11 08:53 .bash_logout
-rw-r--r--. 1 centos centos 193 Apr 11 08:53 .bash_profile
-rw-r--r--. 1 centos centos 231 Apr 11 08:53 .bashrc
drwxr-xr-x. 4 centos centos 39 Sep 9 18:38 .mozilla
默認創建用戶家目錄會有幾個隱藏文件,這幾個文件,我們之前已經講過了,在之前的
博文中有簡單提及,你就記住,它們是為了讓用戶更好的運行與系統的配置文件即可。
情況1:指定創建用戶家目錄路徑如果存在;
[root@localhost ~]# touch /home/centos/{a..z}.log
[root@localhost ~]# ls /home/centos/{a..z}.log
/home/centos/a.log /home/centos/f.log /home/centos/k.log /home/centos/p.log /home/centos/u.log /home/centos/z.log
/home/centos/b.log /home/centos/g.log /home/centos/l.log /home/centos/q.log /home/centos/v.log
/home/centos/c.log /home/centos/h.log /home/centos/m.log /home/centos/r.log /home/centos/w.log
/home/centos/d.log /home/centos/i.log /home/centos/n.log /home/centos/s.log /home/centos/x.log
/home/centos/e.log /home/centos/j.log /home/centos/o.log /home/centos/t.log /home/centos/y.log
[root@localhost ~]# usermod -d /var/tmp/new_centos centos
[root@localhost ~]# grep ‘^centos‘ /etc/passwd
centos:x:1002:1002::/var/tmp/new_centos:/bin/bash
[root@localhost ~]# ls -a /home/centos/
. a.log .bash_profile b.log d.log f.log h.log j.log l.log .mozilla o.log q.log s.log u.log w.log y.log
.. .bash_logout .bashrc c.log e.log g.log i.log k.log m.log n.log p.log r.log t.log v.log x.log z.log
這種情況,我們指定的家目錄不存在,修改用戶家目錄,會把之前家目錄的文件都拷貝過來。
情況2:指定創建用戶家目錄路徑如果不存在;
[root@localhost ~]# mkdir /tmp/mytestdir
[root@localhost ~]# usermod -d /tmp/mytestdir centos
[root@localhost ~]# ls -a /tmp/mytestdir/
. ..
[root@localhost ~]# ls -a /home/centos/
. a.log .bash_profile b.log d.log f.log h.log j.log l.log .mozilla o.log q.log s.log u.log w.log y.log
.. .bash_logout .bashrc c.log e.log g.log i.log k.log m.log n.log p.log r.log t.log v.log x.log z.log
[root@localhost ~]# ls -a /var/tmp/new_centos
ls: cannot access /var/tmp/new_centos: No such file or directory
[root@localhost ~]# grep ‘centos‘ /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/bash
這種情況,我們的目錄已經存在,這個時候修改用戶家目錄到一個已經存在的目錄,會導致原先家目錄的
文件全部丟失,比較危險。創建用戶應當在用戶創建初期就規劃好用戶相關的屬性信息,即使後期要移動
或者改變,此屬於維護,應當對相關文件進行備份後再操作。
修改用戶centos的默認登錄shell為/sbin/nologin:
[root@localhost tmp]# grep ‘centos‘ /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/bash
[root@localhost tmp]# usermod -s /sbin/nologin centos
[root@localhost tmp]# grep ‘centos‘ /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/sbin/nologin
[root@localhost tmp]# su - centos
This account is currently not available.
[root@localhost tmp]# usermod -s /bin/tcsh centos
[root@localhost tmp]# grep ‘centos‘ /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/tcsh
[root@localhost tmp]# su - centos
Last login: Mon Sep 10 07:58:43 CST 2018 on pts/1
[centos@localhost ~]$ exit
logout
可以看到,當我們把用戶的登錄shell第一次改為/sbin/nologin後,利用su切換到該用戶的時候
直接提示我該用戶不可用。這種做法常應用在,我要以普通身份運行某類應用的工作進程
例如(nginx,apache的工作進程等),我創建的用戶只是為了讓進程啟用身份是普通用戶,所以
為了安全考慮,創建的用戶不需要其登錄。
其實我們可以利用chsh來修改我們的登錄shell,把它修改成最初默認的/bin/bash
[root@localhost ~]# grep ‘centos‘ /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/tcsh
[root@localhost ~]# chsh -l #修改前可以利用這個選項列出一下當前可用的shell
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhost ~]# chsh -s /bin/bash centos
Changing shell for centos.
Shell changed.
[root@localhost ~]# grep ‘centos‘ /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/bash
修改其他屬性,舉一個例子,修改centos用戶密碼最大使用期限
[root@localhost ~]# grep ‘centos‘ /etc/shadow
centos:!!:17783:0:99999:7:::
[root@localhost ~]# chage -M 128 centos
[root@localhost ~]# grep ‘centos‘ /etc/shadow
centos:!!:17783:0:128:7:::
可以看到我們的99999變成了128天。
# 案例四(修改組屬性類)
[root@localhost ~]# groupadd -g 30000 luoque
[root@localhost ~]# grep ‘luoque‘ /etc/group
luoque:x:30000:
[root@localhost ~]# groupmod -g 2000 luoque
[root@localhost ~]# grep ‘luoque‘ /etc/group
luoque:x:2000:
[root@localhost ~]# groupmod -n jiumeng luoque
[root@localhost ~]# grep -E ‘luoque|jiumeng‘ /etc/group
jiumeng:x:2000:
[root@localhost ~]# grep -E ‘luoque|jiumeng‘ /etc/gshadow
jiumeng:!::
我新建的另一個組羅雀,顯式指明創建其id為3000。後面利用groupmod工具修改了它的id成為2000.
其後,我又修改成了另外一個新的名字jiumeng。
# 案例五(修改用戶權限類)
我們只是簡單的舉例子,實際如果要想掌握權限知識點,還是希望大家多看理論並結合實際聯系。
工作中,我們經常因為一些特別的原因,要修改某個目錄,某個文件,某幾個目錄裏面用戶的
從屬關系。
[root@localhost ~]# touch /tmp/{1..10}.log
[root@localhost ~]# ls -l /tmp/{1..10}.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/10.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/1.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/2.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/3.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/4.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/5.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/6.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/7.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/8.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/9.log
#下面這部分,利用工具chmod,直接指定修改的權限,非八進制權限
[root@localhost ~]# chmod u+x /tmp/1.log
[root@localhost ~]# ls -l /tmp/1.log
-rwxr--r--. 1 root root 0 Sep 10 08:18 /tmp/1.log
[root@localhost ~]# chmod u-x,u-w /tmp/1.log
[root@localhost ~]# ls -l /tmp/1.log
-r--r--r--. 1 root root 0 Sep 10 08:18 /tmp/1.log
[root@localhost ~]# chmod 400 /tmp/{1..10}.log
[root@localhost ~]# ls -l /tmp/{1..10}.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/10.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/1.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/2.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/3.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/4.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/5.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/6.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/7.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/8.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/9.log
[root@localhost ~]# mkdir -pv /tmp/test1/test2 ; touch /tmp/test1/{a..b}.txt ;touch /tmp/test1/test2/{10..13}.log
mkdir: created directory ‘/tmp/test1’
mkdir: created directory ‘/tmp/test1/test2’
[root@localhost ~]# tree /tmp/test1/
/tmp/test1/
├── a.txt
├── b.txt
└── test2
├── 10.log
├── 11.log
├── 12.log
└── 13.log
1 directory, 6 files
[root@localhost ~]# ls -ld /tmp/test1/
drwxr-xr-x. 3 root root 45 Sep 10 08:21 /tmp/test1/
[root@localhost ~]# ls -l /tmp/test1/
total 0
-rw-r--r--. 1 root root 0 Sep 10 08:21 a.txt
-rw-r--r--. 1 root root 0 Sep 10 08:21 b.txt
drwxr-xr-x. 2 root root 62 Sep 10 08:21 test2
[root@localhost ~]# ls -lR /tmp/test1/
/tmp/test1/:
total 0
-rw-r--r--. 1 root root 0 Sep 10 08:21 a.txt
-rw-r--r--. 1 root root 0 Sep 10 08:21 b.txt
drwxr-xr-x. 2 root root 62 Sep 10 08:21 test2
/tmp/test1/test2:
total 0
-rw-r--r--. 1 root root 0 Sep 10 08:21 10.log
-rw-r--r--. 1 root root 0 Sep 10 08:21 11.log
-rw-r--r--. 1 root root 0 Sep 10 08:21 12.log
-rw-r--r--. 1 root root 0 Sep 10 08:21 13.log
#下面這部分,遞歸修改文件的權限。
[root@localhost ~]# chmod -R 400 /tmp/test1
[root@localhost ~]# ls -lR /tmp/test1/
/tmp/test1/:
total 0
-r--------. 1 root root 0 Sep 10 08:21 a.txt
-r--------. 1 root root 0 Sep 10 08:21 b.txt
dr--------. 2 root root 62 Sep 10 08:21 test2
/tmp/test1/test2:
total 0
-r--------. 1 root root 0 Sep 10 08:21 10.log
-r--------. 1 root root 0 Sep 10 08:21 11.log
-r--------. 1 root root 0 Sep 10 08:21 12.log
-r--------. 1 root root 0 Sep 10 08:21 13.log
#下面這部分,修改文件的從屬關系,用戶屬主和屬組,遞歸修改多個文件和目錄
[root@localhost ~]# chown -R centos:centos /tmp/test1
[root@localhost ~]# ls -lR /tmp/test1/
/tmp/test1/:
total 0
-r--------. 1 centos centos 0 Sep 10 08:21 a.txt
-r--------. 1 centos centos 0 Sep 10 08:21 b.txt
dr--------. 2 centos centos 62 Sep 10 08:21 test2
/tmp/test1/test2:
total 0
-r--------. 1 centos centos 0 Sep 10 08:21 10.log
-r--------. 1 centos centos 0 Sep 10 08:21 11.log
-r--------. 1 centos centos 0 Sep 10 08:21 12.log
-r--------. 1 centos centos 0 Sep 10 08:21 13.log
[root@localhost ~]#
#下面這一部分,只是修改文件用戶屬組,多個文件和目錄,遞歸選項-R
[root@localhost ~]# id yanhui
uid=1000(yanhui) gid=1000(yanhui) groups=1000(yanhui),1001(hello)
[root@localhost ~]# chown -R .yanhui /tmp/test1/
[root@localhost ~]# ls -lR /tmp/test1/
/tmp/test1/:
total 0
-r--------. 1 centos yanhui 0 Sep 10 08:21 a.txt
-r--------. 1 centos yanhui 0 Sep 10 08:21 b.txt
dr--------. 2 centos yanhui 62 Sep 10 08:21 test2
/tmp/test1/test2:
total 0
-r--------. 1 centos yanhui 0 Sep 10 08:21 10.log
-r--------. 1 centos yanhui 0 Sep 10 08:21 11.log
-r--------. 1 centos yanhui 0 Sep 10 08:21 12.log
-r--------. 1 centos yanhui 0 Sep 10 08:21 13.log
二、linux下權限分類
2.1、基本權限以及模型說明
-
安全上下文說明:
1、進程以某用戶的身份運行; 進程是發起此進程用戶的代理,因此以此用戶的身份和權限完成所有操作;
2、權限匹配模型:
(1) 判斷進程的屬主,是否為被訪問的文件屬主;如果是,則應用屬主的權限;否則進入第2步;
(2) 判斷進程的屬主,是否屬於被訪問的文件屬組;如果是,則應用屬組的權限;否則進入第3步;
(3) 應用other的權限; - 權限:
r:readable,讀
w:writable,寫
x:excutable,執行
- 基本權限相對於文件:
r:可獲取文件的數據;
w:可修改文件的數據;
x:可將此文件發起運行為進程;
- 基本權限相對於目錄:
r:可使用ls命令獲取其下的所有文件列表;
w:可修改此目錄下的文件列表;即創建或刪除文件;
x:可cd至此目錄中,且可使用ls -l來獲取所有文件的詳細屬性信息;
- 權限模型(基本的9位,ls -l可以看見的屬性)以及從屬關系:
mode:rwxrwxrwx
ownership:user,group
- 權限組合機制:八進制表示0~7,最大為7,二進制可以為111,最小為0,二進制可以為000
--- 二進制表示:000 轉換成八進制:0
r-- 二進制表示:100 轉換成八進制:4
rw- 二進制表示:110 轉換成八進制:6
r-x 二進制表示:101 轉換成八進制:5
-w- 二進制表示:010 轉換成八進制:2
-wx 二進制表示:011 轉換成八進制:3
--x 二進制表示:001 轉換成八進制:1
rwx 二進制表示:111 轉換成八進制:7
- 附加特殊權限:
管理特殊權限的另一方式:
suid sgid sticy 八進制權限
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
基於八進制方式賦權時,可於默認的三位八進制數字左側再加一位八進制數字
例如:chmod 1777
2.2、特殊權限SUID
默認情況下:用戶發起的進程,進程的屬主是其發起者;因此,其以發起者的身份在運行;
SUID的功用:用戶運行某程序時,如果此程序擁有SUID權限,那麽程序運行為進程時,進程的屬主不是
發起者,而程序文件自己的屬主;
管理文件的SUID權限:
chmod u+|-s FILE...
展示位置:屬主的執行權限位
如果屬主原本有執行權限,顯示為小寫s;
否則,顯示為大寫S;
2.3、特殊權限SGID
功用:當目錄屬組有寫權限,且有SGID權限時,那麽所有屬於此目錄的屬組,且以屬組身份在此目錄中新建文件或目錄時,新文件的屬組不是用戶的基本組,而是此目錄的屬組;
管理文件的SGID權限:
chmod g+|-s FILE...
展示位置:屬組的執行權限位
如果屬組原本有執行權限,顯示為小寫s;
否則,顯示為大寫S;
2.4、特殊權限Sticky
功用:對於屬組或全局可寫的目錄,組內的所有用戶或系統上的所有用戶對在此目錄中都能創建新文件或刪除所有的已有文件;如果為此類目錄設置Sticky權限,則每個用戶能創建新文件,且只能刪除自己的文件;
管理文件的Sticky權限:
chmod o+|-t FILE...
展示位置:其它用戶的執行權限位
如果其它用戶原本有執行權限,顯示為小寫t;
否則,顯示為大寫T;
系統上的/tmp和/var/tmp目錄默認均有sticky權限;
小貼士:初學者,建議先用戶管理和初級權限控制學透後再分析特殊權限,我這裏由於時間關系,暫時不列舉示例
後續對文章進行二次編輯的時候會考慮增加實際案例分析說明,如果有興趣的或者有疑問的可以給我留言,或者
大家一起相互探討。
2.5、靈活權限管控機制acl
文件的額外賦權機制:
在原來的u,g,o之外,另一層讓普通用戶能控制賦權給另外的用戶或組的賦權機制;
- getfacl命令:
getfacl FILE...
user:USERNAME:MODE
group:GROUPNAME:MODE
[root@localhost tmp]# touch 123.txt
[root@localhost tmp]# ls -l 123.txt
-rw-r--r--. 1 root root 0 Sep 10 08:33 123.txt
[root@localhost tmp]# getfacl 123.txt
# file: 123.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
我創建了一個123.txt的文件,可以看到getfacl的輸出結果,分為六列。
第一列:file列,分隔符冒號後邊指明流getfacl查看的文件名;
第二列:owner,指明的是權限從屬關系中的文件屬主;
第三列:group,指明的是權限從屬關系中的文件屬組;
第四列:user,表示的是owner中屬主的權限位標誌;
第五列:group,表示的是group中屬組的權限位標誌;
第六列:other,表示其他者權限位標誌;
- setfacl命令:
賦權給用戶:
setfacl -m u:USERNAME:MODE FILE...
[root@localhost tmp]# chmod 600 123.txt
[root@localhost tmp]# ls -l 123.txt
-rw-------. 1 root root 0 Sep 10 08:33 123.txt
[root@localhost tmp]# setfacl -m u:centos:rw 123.txt
[root@localhost tmp]# getfacl 123.txt
# file: 123.txt
# owner: root
# group: root
user::rw-
user:centos:rw-
group::---
mask::rw-
other::---
例子中,我們先利用chmod把123.txt文件改成只有文件屬主才有權限讀寫,
然後讓普通用戶centos對該文件有讀寫權限,
後邊新增了一列user:centos:rw-
每授權給一個用戶,這裏都會新增一列,格式為:
用戶名或組名:權限標誌
這樣,即使我不屬於root組,而且又不讓其他所有人都可以讀寫123.txt,我作為普通用戶
centos,也可以讀寫該文件了。
[root@localhost tmp]# su - centos
Last login: Mon Sep 10 07:59:36 CST 2018 on pts/1
-bash-4.2$ echo 123 > 123.txt
[root@localhost tmp]# su - yanhui
\[yanhui@localhost ~]$ cat /var/tmp/123.txt
cat: /var/tmp/123.txt: 權限不夠
[yanhui@localhost ~]$ echo 345 > /var/tmp/123.txt
-bash: /var/tmp/123.txt: 權限不夠
賦權給組:
setfacl -m g:GROUPNAME:MODE FILE...
賦權給組的案例,我就不演示了,二次編輯該博文會考慮添加案例。
撤銷賦權:
setfacl -x u:USERNAME FILE...
setfacl -x g:GROUPNAME FILE...
[root@localhost tmp]# setfacl -x u:centos 123.txt
[root@localhost tmp]# getfacl 123.txt
# file: 123.txt
# owner: root
# group: root
user::rw-
group::---
mask::---
other::---
linux下權限管理