淺談Java安全編碼之文件和共享目錄的安全性
chmod是linux下面的權(quán)限管理命令,我們可以通過(guò)chmod來(lái)對(duì)文件的權(quán)限進(jìn)行修改。
普通文件的權(quán)限有三種,rwx分別是讀,寫(xiě)和執(zhí)行。再加上三個(gè)用戶(hù)分組:owner,group,other 我們可以很方便的使用三個(gè)0-7的數(shù)字來(lái)表示一個(gè)文件的權(quán)限。
舉個(gè)例子,我們創(chuàng)建一個(gè)文件:
touch test.log
看一下默認(rèn)的文件權(quán)限:
ll test.log
-rw-r--r-- 1 flydean wheel 0B 8 16 10:36 test.log
默認(rèn)的文件權(quán)限是644,也就是說(shuō)owner權(quán)限是讀寫(xiě),group權(quán)限是讀,其他權(quán)限是讀。
我們可以使用chmod命令對(duì)其進(jìn)行修改,比如:
chmod 777 test.log
ll test.log
-rwxrwxrwx 1 flydean wheel 0B 8 16 10:36 test.log
可以看出權(quán)限被修改成為777。
二、linux文件的特殊權(quán)限講完普通權(quán)限,我們接下來(lái)講一下linux文件中的特殊權(quán)限。
2.1、Set UID 和 Set GID考慮一個(gè)常用的修改密碼的例子,修改密碼調(diào)用的是/usr/bin/passwd,看下這個(gè)文件的權(quán)限:
ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
可以看到有個(gè)很奇怪的s權(quán)限。這個(gè)s是什么意思呢?s實(shí)際是x的變種,是一種特殊的可執(zhí)行權(quán)限。
特殊在哪里呢?passwd是修改用戶(hù)的密碼,密碼文件實(shí)際上是存放在 /etc/shadow中的。
我們看下/etc/shadow的權(quán)限:
ll /etc/shadow
---------- 1 root root 707 Jan 2 2020 /etc/shadow
/etc/shadow的owner是root,只有root才權(quán)限強(qiáng)行寫(xiě)入這個(gè)文件。
那么問(wèn)題來(lái)了,普通用戶(hù)調(diào)用passwd是怎么修改的/etc/shadow呢?
這就是s的妙用,s表示Set UID,簡(jiǎn)稱(chēng)為SUID,這個(gè)UID表示User的ID,而User表示這個(gè)程序(/usr/bin/passwd)的擁有者(root),那么我們?cè)谡{(diào)用passwd的過(guò)程時(shí)候,就會(huì)暫時(shí)擁有passwd owner的權(quán)限,也就是root權(quán)限。
注意,SUID只能用在二進(jìn)制文件中,它是對(duì)x權(quán)限的一個(gè)替換,并且SUID對(duì)目錄是無(wú)效的。
同樣的,我們也可以給group設(shè)置UID權(quán)限,也就是Set GID。
不同的是SGID可以使用在文件和目錄兩個(gè)地方。
用在文件中是和SUID一樣的,用在目錄中的意思是在該目錄中所建的文件或目錄的用戶(hù)組都和該目錄的用戶(hù)組是一樣的。
2.2、Sticky BitSticky Bit表示的是特殊的other權(quán)限,用t來(lái)表示。
/tmp目錄就是一個(gè)Sticky Bit的例子: drwxrwxrwt 。
SBit對(duì)目錄的作用是:“在具有SBit的目錄下,用戶(hù)若在該目錄下具有w及x權(quán)限,則當(dāng)用戶(hù)在該目錄下建立文件或目錄時(shí),只有文件擁有者與root才有權(quán)力刪除”
這個(gè)特性就是為了保護(hù)我們?cè)诠蚕砟夸浵碌奈募槐粍e人刪除。
2.3、SUID/SGID/SBIT權(quán)限設(shè)置怎么設(shè)置這些權(quán)限呢?
普通權(quán)限我們是用3個(gè)數(shù)字來(lái)表示的,我們可以在3個(gè)數(shù)字之前再加上一個(gè)數(shù)字表示SUID/SGID/SBIT權(quán)限。
和普通權(quán)限一樣,我們用4來(lái)表示SUID,2表示SGID,1表示SBIT。
舉個(gè)例子:
touch test
chmod 6755 test
ll test
-rwsr-sr-x 1 crawler crawler 0 Aug 16 11:43 test
注意,有時(shí)候我們會(huì)遇到大寫(xiě)的S與T的情況,這種情況出現(xiàn)在user、group以及others都沒(méi)有x這個(gè)可執(zhí)行的標(biāo)志,所以大寫(xiě)的S和T表示為空。
三、文件隱藏屬性有些linux系統(tǒng)提供了chattr命令來(lái)設(shè)置文件隱藏屬性。
我們看下chattr的使用:
Usage: chattr [-RVf] [-+=aAcCdDeijsStTu] [-v version] files...
參數(shù):
增加某個(gè)特殊參數(shù),其他原本存在的參數(shù)不動(dòng)。 刪除某個(gè)特殊參數(shù),其他原本存在的參數(shù)不動(dòng)。= : 設(shè)置一定,且僅有后面接的參數(shù)
A : 當(dāng)設(shè)置了A屬性時(shí),這個(gè)文件(或目錄)的存取時(shí)間atime(access)將不可被修改,可避免例如手提電腦有磁盤(pán)I/O錯(cuò)誤的情況發(fā)生。
S : 這個(gè)功能有點(diǎn)類(lèi)似sync.就是將數(shù)據(jù)同步寫(xiě)入磁盤(pán)中。可以有效地避免數(shù)據(jù)流失。
a : 設(shè)置a之后,這個(gè)文件將只能增加數(shù)據(jù),而不能刪除,只有root才能設(shè)置這個(gè)屬性。
c : 這個(gè)屬性設(shè)置之后,將會(huì)自動(dòng)將此文件“壓縮”,在讀取的時(shí)候?qū)?huì)自動(dòng)解壓縮,但在存儲(chǔ)的時(shí)候,將會(huì)先進(jìn)行壓縮后再存儲(chǔ)(對(duì)于大文件有用)。
d : 當(dāng)執(zhí)行dump(備份)程序的時(shí)候,設(shè)置d屬性將可使該文件(或目錄)具有轉(zhuǎn)儲(chǔ)功效。
i : i的作用很大。它可以讓一個(gè)文件“不能被刪除、改名、設(shè)置連接,也無(wú)法寫(xiě)入或新增數(shù)據(jù)”。對(duì)于系統(tǒng)安全性有相當(dāng)大的幫助。
j : 當(dāng)使用ext3文件系統(tǒng)格式時(shí),設(shè)置j屬性將會(huì)使文件在寫(xiě)入時(shí)先記錄在journal中。但是,當(dāng)文件系統(tǒng)設(shè)置參數(shù)為data=journalled時(shí),由于已經(jīng)設(shè)置日志了,所以這個(gè)屬性無(wú)效。
s : 當(dāng)文件設(shè)置了s參數(shù)時(shí),它將會(huì)從這個(gè)硬盤(pán)空間完全刪除。
u : 與s相反,當(dāng)使用u來(lái)設(shè)置文件時(shí),則數(shù)據(jù)內(nèi)容其實(shí)還存在磁盤(pán)中,可以用來(lái)還原刪除。
四、特殊文件linux中還有一些特殊的文件,比如鏈接文件和設(shè)備文件。
在處理鏈接文件的時(shí)候,我們需要注意判斷鏈接文件的真實(shí)指向。
而設(shè)備文件我們需要注意不合理的授權(quán)訪問(wèn)。
五、java中在共享目錄中使用文件要注意的問(wèn)題共享目錄中因?yàn)樗腥硕加胁僮魑募臋?quán)限,所以,我們需要特別注意在java中共享目錄中文件的操作。
根據(jù)java的規(guī)范, java.nio.channels.FileLock可以用來(lái)表示文件的鎖定。
通常來(lái)講,鎖定有兩種,一種是排他鎖,一種是共享鎖。
共享鎖可防止其他同時(shí)運(yùn)行的程序獲取重疊的排他鎖,但確實(shí)允許它們獲取重疊的共享鎖。排他鎖可防止其他程序獲取任一類(lèi)型的重疊鎖。
共享鎖支持來(lái)自多個(gè)進(jìn)程的并發(fā)讀取訪問(wèn);獨(dú)占鎖支持獨(dú)占寫(xiě)訪問(wèn)。
但是,加鎖是否真正的阻塞其他程序?qū)υ撐募脑L問(wèn),實(shí)際是取決于操作系統(tǒng)。
在使用中,我們需要對(duì)用戶(hù)用戶(hù)傳入的文件進(jìn)行一些必要的校驗(yàn),比如是否是常規(guī)文件:
String filename = /* Provided by user */;Path path = new File(filename).toPath();try { BasicFileAttributes attr = Files.readAttributes( path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS); // Check if (!attr.isRegularFile()) { System.out.println('Not a regular file'); return; } // Other necessary checks // Use try (InputStream in = Files.newInputStream(path)) { // Read file };} catch (IOException x) { // Handle error}
上面的例子中,我們通過(guò)獲取File的屬性,來(lái)判斷這個(gè)屬性是否regularFile,注意,我們?cè)谧x取文件屬性的時(shí)候,傳入了一個(gè)LinkOption.NOFOLLOW_LINKS,表示的是不要follow鏈接。
雖然我們首先判斷了file的權(quán)限,然后再對(duì)其進(jìn)行操作,但是上面的例子還是會(huì)有問(wèn)題的。因?yàn)榇嬖跁r(shí)間差的問(wèn)題,如果惡意用戶(hù)在判斷之后將文件替換成了惡意的鏈接文件,就會(huì)出現(xiàn)問(wèn)題。
六、安全目錄為了保證用戶(hù)的文件操作安全性,我們引入一個(gè)安全目錄的概念,所謂安全目錄就是目錄除了用戶(hù)本身和超級(jí)管理員之外,沒(méi)有其他用戶(hù)的寫(xiě)訪問(wèn)權(quán)限,并且給定文件的父目錄不會(huì)被除了系統(tǒng)管理員之外的其他任何用戶(hù)刪除或重命名。
在下方的源碼鏈接中,我提供了一個(gè)查看安全目錄的class,大家可以自行查看。
本文的代碼:learn-java-base-9-to-20/tree/master/security
以上就是淺談Java安全編碼之文件和共享目錄的安全性的詳細(xì)內(nèi)容,更多關(guān)于Java安全編碼 文件和共享目錄的安全性的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. IntelliJ IDEA刪除類(lèi)的方法步驟2. Python中關(guān)于logging模塊的學(xué)習(xí)筆記3. Vue實(shí)現(xiàn)仿iPhone懸浮球的示例代碼4. js select支持手動(dòng)輸入功能實(shí)現(xiàn)代碼5. vue使用moment如何將時(shí)間戳轉(zhuǎn)為標(biāo)準(zhǔn)日期時(shí)間格式6. Android 實(shí)現(xiàn)徹底退出自己APP 并殺掉所有相關(guān)的進(jìn)程7. Spring的異常重試框架Spring Retry簡(jiǎn)單配置操作8. JSP中Servlet的Request與Response的用法與區(qū)別9. Struts2獲取參數(shù)的三種方法總結(jié)10. PHP正則表達(dá)式函數(shù)preg_replace用法實(shí)例分析
