Linux 的權限管理

開一個 Nginx web server

看一下 config

換成自己的資料夾

2. SELinux (Security-Enhanced Linux)

↖在 Linux 原來的檔案權限機制外

    加一層權限控管的規則

1. Linux 檔案目錄權限

Linux 的檔案目錄權限

每個檔案跟目錄都有設定權限

Linux 的檔案目錄權限

-        rw-        rw-        r--        1        luyunghsien        luyunghsien        ...

是檔案還是目錄

目錄: d

檔案: -

擁有者

的權限

群組

的權限

其他使用者

的權限

擁有者

群組

Linux 的檔案目錄權限

r, w, x 分別代表讀、寫執行的權限

目錄的 r 表示可以讀取目錄下的內容 (第一層)

            w表示可以修改目錄下的內容 (第一層)

            x 表示可以進去這個目錄 (cd)

(不能進去的話其實也就不能修改內容了)

Linux 的檔案目錄權限

擁有者可以修改權限

 

r w x 分別對應 4 2 1

可以用相加起來的數字表示權限

 

例如

rwx -> 4 + 2 + 1 = 7

r-x   -> 4 + 0 + 1 = 5

r--    -> 4 + 0 + 0 = 4

Linux 的檔案目錄權限

6

6

4

chmod 777 test.txt

Linux 的檔案目錄權限

chmod 000 test.txt

sudo

基本的權限控管:看使用者有沒有某個檔案的 (讀、寫、執行) 權限

運行的程式會繼承使用者的權限:cat test.txt

有的時候會需要使用者能夠用程式擁有者的權限,

用比較高的權限來做一些工作

例如 passwd 就是這樣做的

sudo

s???

sudo

s???

這個 s 表示使用者執行的時候

會使用程式執行檔擁有者的權限

要為執行檔設定這個,就在 chmod 的 3 碼前面加 '4'

chmod 4711 test.sh
chmod 711 test.sh

sudo

SELinux

在 Linux 原來的檔案權限機制之前

    加一層權限控管的規則

(要先過 SELinux 這關才會繼續原本的檔案權限確認)

SELinux

Linux 幾個大家族中最知名的兩個

Debian

Ubuntu

Red Hat

RHEL

CentOS

fedora

預設沒裝相關工具

預設開啟

SELinux

原本 Linux 權限管理方式的缺點:

 

1. 檔案擁有者不一定會把權限設好

2. 使用程式的人可能會有過大的權限,如果程式有 bug 就

例如:

有些程式需要 root 權限才能順利執行的話,使用的人就有 root 的權限

如果不是 root 權限,可能也是擁有者的權限,有機會存取擁有者的其他檔案

SELinux

為每個程式跟資源標記類型

根據規則決定某個類型的程式有沒有存取某個類型資源的權限

SELinux

加一個參數 Z 來看 nginx 程式的 "context"

user

role

type

level

SELinux

SELinux 根據資料夾位置跟名稱給預設的 context

移動檔案不會改變 context

SELinux

getsebool -a | grep httpd

查規則可以用 getsebool

所以 Nginx 的問題

首先是 nginx 這個使用者沒辦法讀取我設的資料夾 /home/luyunghsien/www

解決辦法:

1. 把 user 改成 root

2. chmod 701 /home/luyunghsien

所以 Nginx 的問題

再來是根據 SELinux 規則 Nginx 沒有權限

1. 把 SELinux 暫時關閉

 

 

 

2. 讓 httpd 可以用家目錄 setsebool -P httpd_enable_homedirs on

 

 

 

3. 把檔案的 context 改為 httpd_sys_content_t

setsebool -P httpd_enable_homedirs on
setenforce 0
chcon -Rt httpd_sys_content_t /home/luyunghsien/www

解決辦法:

如果要把 nginx 用作 Reverse proxy

server

Nginx

reverse proxy

serverA

127.0.0.1:8000

serverB

127.0.0.1:8001

serverC

127.0.0.1:8002

request

需要開啟 httpd_can_network_connect 這個規則

setsebool -P httpd_can_network_connect on

參考資料

Stack Overflow

CentOS 官網

鳥哥的 Linux 私房菜

permissions in Linux

By luyunghsien

permissions in Linux

  • 445