歡迎您光臨本站 註冊首頁

關於smb問題.

←手機掃碼閱讀     火星人 @ 2014-03-23 , reply:0

昨天有個朋友裝smb,結果可以登錄,但是訪問不了文件夾,提示:
You might not have permission to use this network resource. Contact the administrator of this server to find out if you haveaccess pemissions.
其實就是selinux沒關閉.很簡單!
seLinux很強大的,看看下面的介紹.
1.背景
SELinux是「Security-Enhanced Linux」的簡稱,是美國國家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)開發的 Linux的一個擴張強制訪問控制安全模塊。原先是在Fluke上開發的,2000年以 GNU GPL 發布。

現在以Linux作為網際網路伺服器是越來越普遍的事了。在我這幾年作過的項目里,WEB的開發基本都是基於Linux的,這裡有給大公司做的,也給政府部門做的,當然更多的是中小企業做的。這其中給政府做的,我們把SELinux作為一個賣點,接受了不少項目。

2.我們需要安全操作系統的理由
現在不論是政府還是民間企業,大家對信息安全問題是越來越關心了,因為企業的業務平台的伺服器上存儲著大量的商務機密,個人資料,個人資料它直接關係到個人的隱私問題。特別是我們政府的網站,作為信息公開的平台,它的安全就更顯得重要了。這些連到互聯網的伺服器,不可避免的要受到來自世界各地的各種威脅。最壞的時候我們的伺服器被入侵,主頁文件被替換,機密文件被盜走。除了來自外部的威脅外,內部人員的不法訪問,攻擊也是不可忽視的。對於這些攻擊或者說是威脅,當然有很多的辦法,有防火牆,入侵檢測系統,打補丁等等。因為Linux也和其他的商用UNIX一樣,不斷有各類的安全漏洞被發現。我們對付這些漏洞不得不花很多的人力來堵住它。在這些手段之中,提高OS系統自身的牢固性就顯得非常的重要。
2.1傳統的Linux OS的不足之處
雖然Linux 比起 Windows 來說,它的可靠性,穩定定要好得多,但是他也是和其他的UNIX 一樣,有以下這些不足之處。
1)存在特權用戶root
  任何人只要得到root的許可權,對於整個系統都可以為所欲為。這一點Windows也一樣。
2)對於文件的訪問權的劃分不夠細
  在linux系統里,對於文件的操作,只有「所有者」,「所有組」,「其他」這3類的劃分。
  對於「其他」這一類里的用戶再細細的劃分的話就沒有辦法了。
3)SUID程序的許可權升級
  如果設置了SUID許可權的程序有了漏洞的話,很容易被攻擊者所利用。
4)DAC(Discretionary Access Control)問題
  文件目錄的所有者可以對文件進行所有的操作,這給系統整體的管理帶來不便。

對於以上這些的不足,防火牆,入侵檢測系統都是無能為力的。
在這種背景下,對於訪問許可權大幅強化的OS SELinux來說,它的魅力的無窮的。
2.2 SELinux的優點
SELinux系統比起通常的Linux系統來,安全性能要高的多,它通過對於用戶,進程許可權的最小化,即使受到攻擊,進程或者用戶許可權被奪去,也不會對整個系統造成重大影響。

接下來我來介紹SELinux的一些特點。

特點1:MAC(Mandatory Access Control)???對訪問的控制徹底化
對於所有的文件,目錄,埠這類的資源的訪問,都可以是基於策略設定的,這些策略是由管理員定製的、一般用戶是沒有許可權更改的。

特點2: TE (Type Enforcement)??? 對於進程只付與最小的許可權
Te概念在 SELinux里非常的重要。它的特點是對所有的文件都賦予一個叫type的文件類型標籤,對於所有的進程也賦予各自的一個叫 domain的 標籤。Domain標籤能夠執行的操作也是由access vector在策略里定好的。
我們熟悉的apache伺服器,httpd進程只能在httpd_t 里運行,這個httpd_t 的domain能執行的操作,比如能讀網頁內容文件賦予httpd_sys_content_t, 密碼文件賦予shadow_t, TCP的80埠賦予 http_port_t等等。如果在access vector里我們不允許 http_t來對http_port_t進行操作的花,Apache啟動都啟動不了。反過來說,我們只允許80埠,只允許讀取被標為httpd_sys_content_t的文件,httpd_t就不能用別的埠,也不能更改那些被標為httpd_sys_content_t的文件(read only)。

特點3: domain遷移 ?? 防止許可權升級
在用戶環境里運行點對點下載軟體azureus,你當前的domain是fu_t, 但是,你考慮到安全問題,你打算讓他在azureus_t里運行,你要是在terminal里用命令啟動azureus的話,它的進程的domain就會默認繼承你實行的shell的fu_t。
有了domain遷移的話,我們就可以讓azureus在我們指定的azureus_t里運行,在安全上面,這種做法更可取,它不會影響到你的fu_t。
下面是domain遷移指示的例子:
domain_auto_trans(fu_t, azureus_exec_t, azureus_t)
意思就是,當在 fu_t domain里,實行了 被標為 azureus_exec_t的文件時,domain 從fu_t遷移到 azureus_t 。下面是Apache啟動的遷移圖。注意了,因為從哪一個domain能遷移到httpd_t是在策略里定好了,所以要是我們手動(/etc/init.d/httpd start)啟動apache的話,可能仍然留在sysadm_t里,這樣就不能完成正確的遷移。要用run_init命令來手動啟動。


特點4: RBAC(role base access control) ????? 對於用戶只付與最小的許可權
對於用戶來說,被劃分成一些ROLE,即使是ROOT用戶,你要是不在sysadm_r里,也還是不能實行sysadm_t管理操作的。因為,那些ROLE可以執行那些domain也是在策略里設定的。ROLE也是可以遷移的,但是也只能安策略規定的遷移。

3. 控制切換
從fedora core 2開始, 2.6內核的版本都支持selinux.我們看看 Fedora core 5 里的/etc/sysconfig/selinux標準設定吧。
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
#SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

SELINUX有「disabled」「permissive」,「enforcing」3種選擇。

Disabled就不用說了,permissive就是Selinux有效,但是即使你違反了策略的話它讓你繼續操作,但是把你的違反的內容記錄下來。在我們開發策略的時候非常的有用。
相當於Debug模式。
Enforcing就是你違反了策略,你就無法繼續操作下去。

SELINUXTYPE呢,現在主要有2大類,一類就是紅帽子開發的targeted,它只是對於,主要的網路服務進行保護,比如 apache ,sendmail, bind,postgresql等,不屬於那些domain的就都讓他們在unconfined_t里,可導入性高,可用性好但是不能對整體進行保護。
另一類是Strict,是NAS開發的,能對整個系統進行保護,但是設定複雜,我認為雖然它複雜,但是一些基本的會了,還是可以玩得動的。

我們除了在/etc/sysconfig/selinux設它有效無效外,在啟動的時候,也可以通過傳遞參數selinux給內核來控制它。(Fedora 5默認是有效)

kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet selinux=0
上面的變更可以讓它無效。

[root@python sysconfig]# /usr/sbin/getenforce
Enforcing
確認有效后重新對文件系統賦予標籤:
[root@python sysconfig]# /sbin/fixfiles relabel
或者
[root@python /]# touch /.autorelabel
然後 reboot ,你就在secure的Linux環境下工作了。
4. SELinux的基本操作
SELinux是個經過安全強化的Linux操作系統,實際上,基本上原來的運用軟體沒有必要修改就能在它上面運行。真正做了特別修改的RPM包只要50多個。像文件系統EXT3都是經過了擴展。對於一些原有的命令也進行了擴展,另外還增加了一些新的命令,接下來我們就來看看這些命令。
4.1 文件操作
1)ls命令
在命令后加個 -Z 或者加 ?context
[root@python azureus]# ls -Z
-rwxr-xr-x fu fu user_u:object_r:user_home_t azureus
-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar
-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus.png

2)chcon
更改文件的標籤
[root@python tmp]# ls --context test.txt
-rw-r--r-- root root root:object_r:staff_tmp_t test.txt

[root@python tmp]# chcon -t etc_t test.txt
[root@python tmp]# ls -lZ test.txt
-rw-r--r-- root root root:object_r:etc_t test.txt

3)restorecon
當這個文件在策略里有定義是,可以恢復原來的 文件標籤。

4)setfiles
跟chcon一樣可以更改一部分文件的標籤,不需要對整個文件系統重新設定標籤。

5)fixfiles
一般是對整個文件系統的, 後面一般跟 relabel,對整個系統 relabel后,一般我們都重新啟動。如果,在根目錄下有.autorelabel空文件的話,每次重新啟動時都調用 fixfiles relabel

6)star
就是tar在SELinux下的互換命令,能把文件的標籤也一起備份起來。

7)cp
可以跟 -Z, --context=CONTEXT 在拷貝的時候指定目的地文件的security context

8)find
可以跟 ?context 查特定的type的文件。
例子:
find /home/fu/ --context fu:fu_r:amule_t -exec ls -Z {} \:

9)run_init
在sysadm_t裏手動啟動一些如Apache之類的程序,也可以讓它正常進行,domain遷移。
4.2進程domain的確認
程序現在在那個domain里運行,我們可以在ps 命令后加 -Z
[root@python /]# ps -eZ
LABEL PID TTY TIME CMD
system_u:system_r:init_t 1 ? 00:00:00 init
system_u:system_r:kernel_t 2 ? 00:00:00 ksoftirqd/0
system_u:system_r:kernel_t 3 ? 00:00:00 watchdog/0
4.3ROLE的確認和變更
命令id能用來確認自己的 security context
[root@python ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:staff_r:staff_t
這裡,雖然是ROOT用戶,但也只是在一般的ROLE和staff_t里運行,如果在enforcing模式下,這時的ROOT對於系統管理工作來說,是什麼也幹不了。

[root@python ~]# newrole -r sysadm_r
Authenticating root.
口令:
[root@python ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:sysadm_r:sysadm_t
4.4模式切換
1)getenforce
得到當前的SELINUX值
[root@python bin]# getenforce
Permissive
2)setenforce
更改當前的SELINUX值 ,後面可以跟 enforcing,permissive 或者 1, 0。
[root@python bin]# setenforce permissive

3)sestatus
顯示當前的 SELinux的信息
[root@python bin]# sestatus -v
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: permissive
Policy version: 20
Policy from config file: refpolicy

Process contexts:
Current context: user_u:user_r:user_t
Init context: system_u:system_r:init_t
/sbin/mingetty system_u:system_r:getty_t
/usr/sbin/sshd system_u:system_r:sshd_t

File contexts:
Controlling term: user_u:object_r:user_devpts_t
/etc/passwd system_u:object_r:etc_t
/etc/shadow system_u:object_r:shadow_t
/bin/bash system_u:object_r:shell_exec_t
/bin/login system_u:object_r:login_exec_t
/bin/sh system_u:object_r:bin_t -> system_u:object_r:shell_exec_t
/sbin/agetty system_u:object_r:getty_exec_t
/sbin/init system_u:object_r:init_exec_t
/sbin/mingetty system_u:object_r:getty_exec_t
4.5其他重要命令
1)Audit2allow
很重要的一個以python寫的命令,主要用來處理日誌,把日誌中的違反策略的動作的記錄,轉換成 access vector,對開發安全策略非常有用。在refpolicy里,它的功能比以前有了很大的擴展。
[root@python log]# cat dmesg | audit2allow -m local > local.te

2)checkmodule -m -o local.mod local.te
編譯模塊
[root@python log]# checkmodule -m -o local.mod local.te
checkmodule: loading policy configuration from local.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 5) to local.mod

3)semodule_package
創建新的模塊
[root@python log]# semodule_package -o local.pp -m local.mod

4)semodule
可以顯示,載入,刪除 模塊
載入的例子:
[root@python log]# semodule -i local.pp

5)semanage
這是一個功能強大的策略管理工具,有了它即使沒有策略的源代碼,也是可以管理安全策略的。因為我主要是介紹用源代碼來修改策略的,詳細用法大家可以參考它的man頁。
5. 定製策略
FC4,RHEL4等都是採用策略1.X版本的,並且是提供策略源代碼的RPM包。從FC5開始策略的版本從1.X 升級到2.X。2.X版本的refpolicy(reference policy)最大的一個變化就是引進模塊(module)這個概念, 同一套策略源代碼就可以支持Multi-LevelSecurity(MLS)和non-MLS。
http://serefpolicy.sf.net/
標準的FC5里不提供源代碼的RPM包。FC5提供的audit2allow,semanage,semodule也是可以開發一些簡單的策略模塊的。但是,要是作策略模塊的開發,增加一個ROLE之類的,最好還是下載refpolicy的源代碼。
5.1策略源文件的安裝
從CVS伺服器下載的源代碼是最新的,如果遇到象make的時候出錯,那麼最好就是把你系統里和SELinux有關的那些包更新到最新的狀態。
從source Forge的CVS伺服器下載源代碼

[root@python src]# cd /usr/local/src
[root@python src]# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy login
[root@python src]# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy co -P refpolicy

[root@python src]# cd refpolicy/

[root@python src]# make install-src

安裝好了的源代碼目錄結構如下圖所示:



每一個模塊有3個文件構成,比如上圖的sudo.fc 就是和 命令sudo相關的文件的定義標籤,(file context rabel),sudo.te是Type Enforcement定義,包括TE訪問規則等,sudo.if是一個外部模塊調用這個模塊的介面定義。

[root@python src]# cd /etc/selinux/refpolicy/src/policy
[root@python policy]# cp build.conf build.conf.org
[root@python policy]# vi build.conf
[root@python policy]# diff build.conf build.conf.org
32c32
< DISTRO = redhat
---
> #DISTRO = redhat
43c43
< MONOLITHIC=n
---
> MONOLITHIC=y
[root@python src]# make conf
[root@python src]# make

這樣,在/etc/selinux/refpolicy/src/policy下生成很多的以pp為後綴的文件,這些就是SELinux模塊。接下來我們修改/etc/sysconfig/selinux,設成SELINUXTYPE=refpolicy,然後reboot.

啟動后,確認策略的適用情況, 現在的版本是20。
[fu@python ~]$ /usr/sbin/sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: permissive
Policy version: 20
Policy from config file: refpolicy
5.2給程序定製domain
開發程序策略的一般步驟
1.給文件,埠之類的object賦予type 標籤
2.設置 Type Enforcement (Domain 遷移,訪問許可)
3.策略載入
4.permissive模式下運行程序
5.確認日誌,用audit2allow生成訪問許可
6.重複1,2,3,4,5動作,直到沒有違反的日誌出現
7.切換到enforcing模式,正式運用
因為我們所常用的那些服務的策略模塊都已經有了,修改的時候也比較簡單。在這裡我就舉個一般的例子。用點對點下載的朋友估計都跟我一樣,在Linux上用 azureus,Amule來下載東西吧。
接下來以azureus為例,介召如何在FC5里追加一個azureus.pp模塊。我們在追加azureus.pp模塊之前,azureus是在系統給用戶設好的user_t domain里運行。
[fu@python azureus]$ ps -efZ|grep azureus
user_u:user_r:user_t fu 1751 1732 0 22:28 pts/3 00:00:00 /bin/bash ./azureus
接下來我們在追加3個文件。
1)azureus.fc
在這裡我只定義一個文件,實際要是真的用的,還要定義azureus_t能寫的目錄等。
[root@python apps]# more azureus.fc
/home/fu/azureus -- gen_context(user_u:object_r:azureus_exec_t,s0)

2)azureus.te
[root@python apps]# more azureus.te
policy_module(azureus,1.0.0)
type azureus_t;
type azureus_exec_t;
role user_r types azureus_t;
require {
type user_t;
};
domain_type(azureus_t)
domain_entry_file(azureus_t, azureus_exec_t)
domain_auto_trans(user_t, azureus_exec_t, azureus_t)


3)azureus.if
實際上沒有別的模塊要調用azureus,所以這個文件就是空文件也不要緊。
[root@python apps]# more azureus.if
# policy/modules/apps/azureus.if
## Myapp example policy
##
## Execute a domain transition to run azureus.
##

##
## Domain allowed to transition.
##
interface(`azureus_domtrans',`
gen_requires(`
type azureus_t, azureus_exec_t;
')
domain_auto_trans($1,azureus_exec_t,azureus_t)
allow $1 azureus_t:fd use;
allow azureus_t $1:fd use;
allow $1 azureus_t:fifo_file rw_file_perms;
allow $1 azureus_t:process sigchld;
')
在/etc/selinux/refpolicy/src/policy/policy/module.conf 里加入下面一行
[root@python policy]# tail -1 modules.conf
azureus = module

確認/etc/selinux/refpolicy/src/policy里MONOLITHIC=n
最後make , make load
[root@python policy]# pwd
/etc/selinux/refpolicy/src/policy
[root@python policy]# make;make load
正常終了后,我們可以用 semodule命令來確認 azureus.pp下載下去了沒有。
[root@python policy]# semodule -l |grep azureus
azureus 1.0.0
看樣子是沒有問題。好了我們再看看 /home/fu/azureus/azureus的security context,我們剛才在azureus.fc里是期望它是 user_u:object_r:azureus_exec_t ,可是它這個時候還是繼承了默認的 user_u:object_r:user_home_t , 如果不是我們期望的文件標籤的話,domain是無法從user_t遷移到azureus_t的,因為relabel的話,會對整個文件系統進行重新設標籤,很花時間,所以我們用在上面介紹過文件標籤更改的命令chcon命令來改標籤。
[root@python azureus]# chcon -t azureus_exec_t azureus
再看看這次的新標籤,果然如我們期望的,變成azureus_exec_t了。
[root@python policy]# ls -lZ /home/fu/azureus/
-rwxr-xr-x fu fu user_u:object_r:azureus_exec_t azureus
-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar
接下來退出ROOT用戶,以用戶fu登錄,運行azureus命令。
[root@python azureus]# ps -efZ|grep azureus
user_u:user_r:azureus_t fu 8703 8647 0 23:23 pts/1 00:00:00 /bin/bash ./azureus
user_u:user_r:azureus_t fu 8717 8703 4 23:24 pts/1 00:01:29 java -Djava.ext.dirs=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre/lib/ext -Xms16m -Xmx128m -cp /home/fu/azureus/Azureus2.jar:/home/fu/azureus/swt.jar -Djava.library.path=/home/fu/azureus -Dazureus.install.path=/home/fu/azureus org.gudy.azureus2.ui.swt.Main
user_u:user_r:user_t root 9347 1956 0 23:59 pts/2 00:00:00 grep azureus

高興吧! 成功了。
在這裡我只是演示如何讓domain遷移,至於azureus的嚴格的access vector的設置我都忽略了。
5.3 給自己增加個專用的ROLE
在這裡我們要增加一個叫madia的ROLE,在追加時要對一些文件進行修改。
5.3.1 /etc/selinux/refpolicy/src/policy/policy/modules/kernel下的文件修改
1) kernel.te
[root@python kernel]# vi kernel.te
在role user_r 的下面加上一行
role madia_r;
2) domain.te
[root@python kernel]# vi domain.te
在 role user_r types domain; 的下面加上一行
role madia_r type domain;
5.3.2 /etc/selinux/refpolicy/src/policy/policy/modules/system下的文件修改
[root@python system]# vi userdomain.te
在第5行追加madia_r,如下所示:
role sysadm_r, staff_r, user_r,madia_r;
在unpriv_user_template(user)下面加上下面的一行。
unpriv_user_template(madia)
5.3.3 /etc/selinux/refpolicy/src/policy/policy下的文件修改
1)user
users和策略1.X里的users差不多。定義用戶能利用的ROLE。
[root@python policy]# vi users
gen_user(madia, madia, madia_r, s0, s0)
2)rolemap
[root@python policy]# vi rolemap
在user_r user user_t下面加上一行
madia_r madia madia_t
5.3.4 重新make 策略
[root@python policy]# make load
5.3.5 /etc/selinux/refpolicy/seusers 文件的修改
Seusers是系統一般用戶和SELinux的用戶映射。
[root@python refpolicy]# vi seusers
madia:madia
5.3.6 /etc/selinux/refpolicy/contexts下的文件修改
1)default_type
決定用戶登錄時的默認ROLE。
[root@python refpolicy]# vi contexts/default_type
madia_r:madia_t
2)default_contexts
決定用戶登錄時的默認security context
[root@python refpolicy]# vi contexts/default_contexts
system_r:local_login_t madia_r:madia_t staff_r:staff_t user_r:user_t sysadm_r:sysadm_t
5.3.7 以madia用戶重新登錄
最後以用戶madia登錄,查看是不是 進入madia_t了。
[madia@python ~]$ id
uid=501(madia) gid=501(madia) groups=501(madia) context=madia:madia_r:madia_t
以上我們可以看出,madia用戶確實是進入了madia_t 運行了。
我們在以上的操作中,實際上還有修改遺漏的地方,每當重新make的時候,seusers都會回到原來的設定,有興趣的朋友可以自己找出哪裡還需要修改。
6.最後
我們現在主要還是targeted策略,因為我們的伺服器,基本上也就跑apache,postgresql,tomcat,bind,postfix這幾個服務。Targeted能夠保護它。我們的目標是將一些影響比較小的,服務比較單一的伺服器移植到能運行strict策略的伺服器上。當然,即使我們用SELinux,對於系統的安全也不能掉以輕心,認為有了SELinux就100%安全。
比如targeted里有unconfined_t,任何在這個domain里運行的都是不被保護的。還有,系統管理員對TE的設置錯誤造成不能很好的保護,還內核的漏洞,Dos攻擊等,SELinux也是無能為力的。
除了SELinux外,還有LIDS ,TOMOYO LINUX,AppArmor等安全操作系統。大家對LIDS和AppArmor有可能比較熟悉,TOMOYO是 日本NTT數據公司開發的。也許有朋友在選擇的時候不知道該用那個好。
安全級別高<----------------------------------->易用性高
SELINUX >> TOMOYO >> LIDS >> AppArmor

[火星人 ] 關於smb問題.已經有489次圍觀

http://coctec.com/docs/linux/show-post-110529.html