歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux服務器 >> Linux 高級用戶,組和權限介紹

Linux 高級用戶,組和權限介紹

日期:2017/3/2 16:29:33   编辑:Linux服務器

  下面先來了解一下關於用戶,組的四個文件

  /etc/passwd

  /etc/shadow

  /etc/group

  /etc/gshadow

  首先來了解一下/etc/passwd這個文件,

  這個文件只是存放用戶的信息

  [root@localhost ~]#

  [root@localhost ~]# cat /etc/passwd | grep user1

  user1:x:500:500::/home/user1:/bin/bash

  [root@localhost ~]#

  這裡面總共有七個欄位,了解一下每個欄位的意義。

  User1 用戶名

  X 用戶的密碼位(如果這個位上面沒有這個X,就代表登陸這個用戶不需要密碼)

  500 UID

  500 GID

  第五個是密碼的描述信息,這裡沒有。

  /home/user1 用戶的/home目錄

  /bin/bash 用戶的shell

  在這裡有個比較特殊的shell /sbin/nologin

  如果將用戶的shell改為/sbin/nologin,那麼這兒用戶只可以登陸服務,但是不可以登陸計算機。不允許交互式登陸。

  再來了解一下/etc/shadow這個文件,

  這個文件主要是用來保存用戶的密碼信息和策略。

  [root@localhost ~]#

  [root@localhost ~]# cat /etc/shadow | grep user1

  user1:$1$2WJEp9K7$h.NRfJsaEm8VMksBQHZm7.:14668:0:99999:7:::

  [root@localhost ~]#

  現在來了解一下每個欄位的意義

  User1 用戶名

  第二個欄位是保存用戶的密碼,這個密碼是經過MD5的加密的。

  如果密碼位前面有個!,就代表這個用戶被鎖定了。

  14668 密碼最後一次修改的時間

  0 密碼最少的存活期(為0代表用戶可以隨時更改密碼)

  99999 密碼過期時間(99999代表密碼永不過期)

  7 密碼過期警告天數(在密碼過期的前七天警告用戶)

  再來了解一下/etc/group這個文件,

  這個文件主要是用於存放組的信息。

  [root@localhost ~]#

  [root@localhost ~]# cat /etc/group | grep user1

  user1:x:500:

  [root@localhost ~]#

  現在來了解一下每個欄位的意義

  User 組的名字

  X 組的密碼位

  500 GID

  可以將用戶直接添加到冒號後面,就代表加入了這個組。

  最後來了解一下/etc/gshadow這個文件,

  這個文件主要是保存組密碼的信息。

  [root@localhost ~]#

  [root@localhost ~]# cat /etc/gshadow | grep user1

  user1:!::

  [root@localhost ~]#

  User 組的名字

  可以看到,這個組默認是沒有密碼的,現在我們給它設置一個密碼。

  [root@localhost ~]#

  [root@localhost ~]# gpasswd user1

  Changing the password for group user1

  New Password:

  Re-enter new password:

  [root@localhost ~]# cat /etc/gshadow | grep user1

  user1:$1$ZxvTf/dQ$DWmf//MTxpwJIzTZIcYQZ/::

  [root@localhost ~]#

  可以看到,組現在也有了一個密碼,而且也是經過MD5加密的。

  下面來看下組的密碼有什麼意義。

  [root@localhost ~]#

  [root@localhost ~]# useradd user2

  [root@localhost ~]#

  [root@localhost ~]# su – user2

  [user2@localhost ~]$

  [user2@localhost ~]$ newgrp user1

  Password:

  [user2@localhost ~]$ id

  uid=501(user2) gid=500(user1) groups=500(user1),501(user2)

  [user2@localhost ~]$

  可以看到,我們user2現在加入到了user1,變成了user1組裡面的成員,也就是說組密碼的意義在於,一個普通用戶只要有組的密碼,就可以加入到這個組裡面來,成為這個組裡面的成員。

  用戶管理工具

  Useradd 添加用戶

  #useradd user1(用戶名)

  [root@localhost ~]#

  [root@localhost ~]# useradd user1

  [root@localhost ~]#

  [root@localhost ~]# id user1

  uid=502(user1) gid=502(user1) groups=502(user1)

  [root@localhost ~]#

  User1就添加成功了。

  Usermod 修改用戶

  Userdel 刪除用戶

  #userdel -r user1(用戶名)

  [root@localhost ~]#

  [root@localhost ~]# userdel -r user1

  [root@localhost ~]#

  [root@localhost ~]# id user1

  id: user1: No such user

  [root@localhost ~]#

  User1就成功刪除了

  -r 在刪除用戶的同時刪除用戶的/home目錄。

  關於監視登陸的工具

  #w

  [root@localhost ~]# w

  15:27:32 up 15:31, 3 users, load average: 0.81, 0.25, 0.08

  USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

  root :0 - 21Feb10 ?xdm? 3:07 0.30s /usr/bin/ gnome-

  root pts/2 :0.0 15:27 0.00s 0.06s 0.01s w

  root pts/1 192.168.0.20 15:27 13.00s 0.05s 0.05s - bash

  [root@localhost ~]#

  可以看到192.168.0.20正在連接我。

  #last

  [root@localhost ~]#

  [root@localhost ~]# last

  root pts/2 station20.exampl Sun Feb 28 15:32 still logged in

  root pts/1 :0.0 Sun Feb 28 15:31 still logged in

  root pts/2 :0.0 Fri Feb 26 17:21 – 00:32 (1+07:10)

  root pts/1 :0.0 Mon Feb 22 23:07 – 21:46 (3+22:38)

  root pts/2 :0.0 Mon Feb 22 18:31 - 23:07 (04:36)

  root pts/2 :0.0 Mon Feb 22 14:33 - 14:33 (00:00)

  root pts/1 :0.0 Sun Feb 21 17:33 - 18:31 (1+00:57)

  root pts/1 :0.0 Sun Feb 21 17:28 - 17:33 (00:04)

  root pts/1 :0.0 Sun Feb 21 13:30 - 17:28 (03:57)

  root :0 Sun Feb 21 13:30 still logged in

  root :0 Sun Feb 21 13:30 – 13:30 (00:00)

  reboot system boot 2.6.18-164.el5 Sun Feb 21 13:29 (7+02:03)

  root pts/1 :0.0 Sun Feb 21 21:22 – down (-7:-54)

  root :0 Sun Feb 21 21:21 – down (-7:-54)

  root :0 Sun Feb 21 21:21 – 21:21 (00:00)

  reboot system boot 2.6.18-164.el5 Sun Feb 21 21:17 (-7:-50)

  reboot system boot 2.6.18-164.el5 Sun Feb 21 21:14 (00:02)

  wtmp begins Sun Feb 21 21:14:07 2010

  [root@localhost ~]#

  曾經有那些用戶登陸過我的計算機。並且在我計算機上面登陸了多久,很多東西都可以查看的到。

  #lastb

  [root@localhost ~]#

  [root@localhost ~]# lastb

  root ssh:notty www.google.com. Mon Feb 22 15:50 – 15:50 (00:00)

  root ssh:notty www.google.com. Mon Feb 22 15:50 – 15:50 (00:00)

  root ssh:notty www.google.com. Mon Feb 22 15:50 – 15:50 (00:00)

  btmp begins Mon Feb 22 15:50:50 2010

  [root@localhost ~]#

  這條命令顯示的結果是那些計算機曾經登錄過我的計算機,但是沒有登錄成功的計算機。只會顯示沒有登錄成功的信息,並且它們是使用的什麼方法嘗試連接我的計算機,這裡面都很詳細。

  默認權限(defaults perm)

  默認的時候,我們在創建文件和目錄的時候,並不是繼承了上級目錄的權限,而是根據目錄和文件的UMASK值來決定的。

  關於UMASK值

  就是用來定義文件的默認權限的

  如何在系統查詢UMASK值呢?

  #umask

  [root@localhost ~]#

  [root@localhost ~]# umask

  0022

  [root@localhost ~]#

  可以看到,系統中的umask值為0022

  當然這個umask也是可以修改的

  #umask 0033

  [root@localhost ~]#

  [root@localhost ~]# umask 0033

  [root@localhost ~]#

  [root@localhost ~]# umask

  0033

  [root@localhost ~]#

  系統的umask值被我們改成0033了。

  Umask是怎麼定義目錄和文件的權限的

  對於不同用戶,umask定義都不一樣。

  對於root uamsk值為022

  對於普通用戶 umask值為002

  那麼我們在創建目錄和文件的時候默認權限是多少呢。

  對於root 目錄 777-022 755

  文件 666-022 644

  對於普通用戶 目錄 777-002 775

  文件 666-002 664

  這就是我們的創建目錄和文件的默認權限。

  注意 :我們在用最高權限減umask值的時候一定是用二進制的數值來減,而不是十進制的數值來減。

  [root@localhost ~]#

  [root@localhost ~]# umask

  0022

  [root@localhost ~]# mkdir test

  [root@localhost ~]# touch test1

  [root@localhost ~]# ll | grep test

  drwxr-xr-x 2 root root 4096 Feb 28 16:42 test

  -rw-r–r– 1 root root 0 Feb 28 16:43 test1

  [root@localhost ~]#

  可以看到,我們目錄的默認權限的確是755.文件的默認權限的確是644。

  [root@localhost ~]#

  [root@localhost ~]# su – user1

  [user1@localhost ~]$

  [user1@localhost ~]$ umask

  0002

  [user1@localhost ~]$ mkdir file

  [user1@localhost ~]$

  [user1@localhost ~]$ touch file1

  [user1@localhost ~]$ ll | grep file

  drwxrwxr-x 2 user1 user1 1024 Feb 28 16:44 file

  -rw-rw-r– 1 user1 user1 0 Feb 28 16:44 file1

  [user1@localhost ~]$

  可以看到,在普通用戶的身份下面。我們創建的目錄的權限為775,文件的權限為664。

  關於三個特殊的權限

  1 .suid權限

  如果在一個可執行文件(命令或者腳本)運用了suid後,那麼任何人在執行該命令的時候會臨時擁有該命令的擁有人權限。

  我們知道passwd這個命令管理員可以運行,還有普通用戶也可以運行。

  還有如果我們利用passwd來修改密碼成功了,是要在/etc/shadow這個文件中去添加一個密碼位的,現在我們看看這個文件的權限。

  [root@localhost ~]#

  [root@localhost ~]# ls -l /etc/shadow

  -r——– 1 root root 1050 Feb 25 23:01 /etc/shadow

  [root@localhost ~]#

  可以看到,這個文件普通用戶什麼權限也沒有,連讀的權限都沒有,那麼普通用戶是怎麼修改自己的密碼,並且能夠將密碼寫在/etc/shadow文件裡面的呢。

  [root@localhost ~]#

  [root@localhost ~]# ll /usr/bin/passwd

  -rwsr-xr-x 1 root root 22960 Jul 17 2006 /usr/bin/passwd

  [root@localhost ~]#

  我們可以看到passwd這個命令的權限位上面多了一個s,這個是我們以前從來沒有看見過的,這個就是suid。

  當普通用戶利用passwd來修改密碼的時候,由於passwd命令上面有suid權限,那麼普通用戶就會臨時擁有該命令的擁有人root的權限,從而就可以往/etc/shadow這個文件裡面去寫入密碼位了。

  現在還有個問題,如果普通用戶因為suid原因可以修改密碼,那麼普通用戶能否去修改別的用戶的密碼呢,我們來嘗試一下。

  [user1@localhost ~]$

  [user1@localhost ~]$ passwd user2

  passwd: Only root can specify a user name.

  [user1@localhost ~]$

  我們可以看到,是不可以修改的。如果按照理論情況,我們的passwd命令因為具有suid權限,那麼是可以修改別的用戶的密碼的。這裡並不是passwd命令不具有suid功能,它也並沒有報權限拒絕。而是提示我們passwd這個命令只有root用戶才可以在後面接上用戶名,系統是從語法上面做了限制,而並不是suid,沒有生效。這也是系統為了保證安全。

  我們在做一個試驗來了解suid的作用

  先來看看系統中根的權限是什麼

  [root@localhost ~]#

  [root@localhost ~]# ls -ld /

  drwxr-xr-x 25 root root 4096 Feb 28 00:30 /

  [root@localhost ~]#

  可以看到,根的權限是755,也就是說一個普通用戶是沒有辦法往根裡面寫入數據的,普通用戶是屬於其他人嗎。我們試試

  [root@localhost ~]#

  [root@localhost ~]# su – user1

  [user1@localhost ~]$

  [user1@localhost ~]$ cd /

  [user1@localhost /]$ mkdir test

  mkdir: cannot create directory `test’: Permission denied

  [user1@localhost /]$

  可以看到,我們的普通用戶user1對根沒有寫入的權限。

  現在我們給mkdir這條命令加一個suid的權限。看看會發生什麼。

  [root@localhost ~]#

  [root@localhost ~]# which mkdir

  /bin/mkdir

  [root@localhost ~]# ll /bin/mkdir

  -rwxr-xr-x 1 root root 29852 Jul 13 2009 /bin/mkdir

  [root@localhost ~]#

  [root@localhost ~]# chmod u+s /bin/mkdir

  [root@localhost ~]#

  [root@localhost ~]# ll /bin/mkdir

  -rwsr-xr-x 1 root root 29852 Jul 13 2009 /bin/mkdir

  [root@localhost ~]#

  可以看到,mkdir這個命令的權限已經多了一個s權限。

  現在我們在使用普通用戶去根下面創建一個文件,

  [root@localhost ~]#

  [root@localhost ~]# su – user1

  [user1@localhost ~]$

  [user1@localhost ~]$ cd /

  [user1@localhost /]$ mkdir file

  [user1@localhost /]$

  [user1@localhost /]$ ll -ld file/

  drwxrwxr-x 2 root user1 4096 Feb 28 21:58 file/

  [user1@localhost /]$

  現在我們就可以在根下面創建目錄了,是因為我們普通用戶在使用mkdir這條命令的時候臨時變成了該命令的擁有人的權限,所有普通用戶就可以在根下面創建目錄,還可以看到,我們通過user1在根下面創建了一個文件,其擁有人也是root,這個也很好的說明了我們的確是使用root的身份去創建的file這個目錄。

  還有一個問題,我們的mkdir這個命令因為多了一個s位,那麼以前的x位權限到哪裡去了呢。如果是S,代表以前是沒有x權限,如果是s,就代表以前有x權限。

  [root@localhost ~]#

  [root@localhost ~]# ll /bin/mkdir

  -rwsr-xr-x 1 root root 29852 Jul 13 2009 /bin/mkdir

  [root@localhost ~]# chmod u-x /bin/mkdir

  [root@localhost ~]# ll /bin/mkdir

  -rwSr-xr-x 1 root root 29852 Jul 13 2009 /bin/mkdir

  [root@localhost ~]# chmod u+x /bin/mkdir

  [root@localhost ~]# ll /bin/mkdir

  -rwsr-xr-x 1 root root 29852 Jul 13 2009 /bin/mkdir

  [root@localhost ~]#

  可以看到,我們去掉了x權限,就變成了S,我們加上x權限,就又變成了s。

  2.sgid權限

  剛才我們的suid只可以運用在一個二進制文件上面,也就是命令上面。

  而我們的sgid可以運用在命令和目錄上面。

  下面先來看下sgid運用在命令上面

  如果允許運用在命令上面,和剛才的suid一樣,只是變成了臨時擁有該命令擁有組的權限,就這點區別。

  下面在來看下sgid運用在目錄上面

  如果當一個目錄運用的sgid權限,那麼任何人在該目錄建立的文件和目錄就會繼承該目錄本身的組。

  現在我們通過一個試驗來了解sgid的權限,

  [root@localhost ~]#

  [root@localhost ~]# mkdir /redhat

  [root@localhost ~]#

  [root@localhost ~]# chmod 777 /redhat/

  [root@localhost ~]#

  [root@localhost ~]# ll -ld /redhat/

  drwxrwxrwx 2 root root 4096 Mar 1 21:26 /redhat/

  [root@localhost ~]#

  現在我們新建了一個redhat目錄,並且這個目錄的權限是777,現在普通用戶對這個目錄也應該是rwx的權限,我們試試,

  [root@localhost ~]#

  [root@localhost ~]# su – user1

  [user1@localhost ~]$

  [user1@localhost ~]$ cd /redhat/

  [user1@localhost redhat]$

  [user1@localhost redhat]$ touch 1.txt

  [user1@localhost redhat]$ ls

  1.txt

  [user1@localhost redhat]$

  我們的確可以創建文件,那麼這個文件的擁有人和擁有組會是誰呢,肯定是user1。現在我們就在這個目錄上面添加一個sgid的權限。

  [root@localhost ~]#

  [root@localhost ~]# chmod g+s /redhat/

  [root@localhost ~]#

  [root@localhost ~]# su – user1

  [user1@localhost ~]$

  [user1@localhost ~]$ cd /redhat/

  [user1@localhost redhat]$

  [user1@localhost redhat]$ touch 2.txt

  [user1@localhost redhat]$

  [user1@localhost redhat]$ ll

  total 0

  -rw-rw-r– 1 user1 user1 0 Mar 1 21:28 1.txt

  -rw-rw-r– 1 user1 root 0 Mar 1 21:30 2.txt

  [user1@localhost redhat]$

  當我給redhat這個目錄添加了一個sgid的權限以後,我們利用普通用戶在redhat目錄裡面創建的文件的擁有組就變成了root了。

  現在我們再來理解一下sgid的權限,當我們在redhat目錄上面運用了sgid的權限,那麼普通用戶user1在redhat目錄下面創建的文件的擁有組就會繼承redhat目錄本身的組,不會隨著用戶的改變而改變。

  還有一點,和剛剛一樣,如果有x權限,就會顯示s,如果沒有x權限,就會顯示S。

  3. sticky權限

  Sticky只可以運用在目錄上面

  如果在一個目錄上面運用了sticky權限,那麼僅root用戶和和文件的擁有人才能刪除該目錄中的文件。

  現在我們通過一個試驗來了解sticky權限。

  [root@localhost ~]#

  [root@localhost ~]# ls -ld /redhat/

  drwxrwxrwx 3 root root 4096 Mar 1 21:48 /redhat/

  [root@localhost ~]#

  Redhat目錄的權限是777,現在普通用戶應該是可以向這個目錄裡面創建文件的,我們來試試。

  [root@localhost ~]#

  [root@localhost ~]# su – user1

  [user1@localhost ~]$ cd /redhat/

  [user1@localhost redhat]$ touch 1.txt

  [user1@localhost redhat]$ ls

  1.txt

  [user1@localhost redhat]$

  我們使用user1在這個目錄中創建了一個1.txt的文件,那麼我們的user2能否去刪除這個文件呢,肯定是可以的,因為我們的目錄權限是777,所有我們的普通用戶user2對這個目錄是有w的權限的,有w權限就意味著可以在這個目錄中創建和刪除文件。我們試下,

  [root@localhost ~]#

  [root@localhost ~]# su – user2

  [user2@localhost ~]$

  [user2@localhost ~]$ cd /redhat/

  [user2@localhost redhat]$

  [user2@localhost redhat]$ ls

  1.txt

  [user2@localhost redhat]$ rm -rf 1.txt

  [user2@localhost redhat]$ ls

  [user2@localhost redhat]$

  OK,是沒有問題的,我們的確可以刪除由user1創建的文件1.txt。

  現在我們給redhat目錄添加一個sticky,看看會發生什麼。

  [root@localhost ~]#

  [root@localhost ~]# chmod o+t /redhat/

  [root@localhost ~]# ls -ld /redhat/

  drwxrwxrwt 2 root root 4096 Mar 1 23:19 /redhat/

  [root@localhost ~]#

  可以看到,redhat目錄已經添加了一個t的權限,這個就是sticky權限。

  和上面一樣,如果有x權限,就顯示t。如果沒有x權限,就顯示T。

  我們在使用user1創建一個文件,然後使用user2刪除這個文件,

  [root@localhost ~]#

  [root@localhost ~]# su – user1

  [user1@localhost ~]$

  [user1@localhost ~]$ cd /redhat/

  [user1@localhost redhat]$

  [user1@localhost redhat]$ touch 2.txt

  [user1@localhost redhat]$

  [user1@localhost redhat]$ ls

  2.txt

  [user1@localhost redhat]$ su – user2

  Password:

  [user2@localhost ~]$ cd /redhat/

  [user2@localhost redhat]$ ls

  2.txt

  [user2@localhost redhat]$ rm -rf 2.txt

  rm: cannot remove `2.txt’: Operation not permitted

  [user2@localhost redhat]$

  可以看到,現在我們使用user1創建的文件,user2是不可以刪除的。

  這個就是sticky權限的作用,

  當一個redhat目錄添加了一個sticky權限後,那麼user1在redhat目錄裡面創建的2.txt文件,就只有root用戶和user1才可以刪除該文件。

  在我們系統中有個目錄就是運用了sticky權限。

  [root@localhost ~]#

  [root@localhost ~]# ls -ld /tmp/

  drwxrwxrwt 15 root root 4096 Feb 28 00:28 /tmp/

  [root@localhost ~]#

  我們的/tmp目錄默認就有了sticky權限。

  我們的特殊權限也可以用數字來表示。

  Suid 4

  Sgid 2

  Sticky 1

  總結:

  Suid權限用在命令上面,而且只能用在用戶上面。

  Sgid權限用在命令和目錄上面,而且只能用在組上面。

  Sticky權限用在目錄上面,而且只能用在其他人上面。

  關於高級權限的問題就這麼多,在133裡面還會有關於用戶,組,權限的討論。

Copyright © Linux教程網 All Rights Reserved