使用fdopen實(shí)現(xiàn)對(duì)Python進(jìn)程產(chǎn)生的文件進(jìn)行權(quán)限最小化配置
需求背景
用python進(jìn)行文件的創(chuàng)建和讀寫(xiě)操作時(shí),我們很少關(guān)注所創(chuàng)建的文件的權(quán)限配置。對(duì)于一些安全性較高的系統(tǒng),如果我們創(chuàng)建的文件權(quán)限其他用戶或者同一用戶組里的其他用戶有可讀權(quán)限的話,有可能導(dǎo)致不必要的信息泄漏的風(fēng)險(xiǎn)。因此,除了創(chuàng)建一個(gè)更加安全和隱私的個(gè)人環(huán)境之外(如容器環(huán)境等),我們還可以對(duì)生成的文件的配置進(jìn)行權(quán)限最小化處理。
常用方法及其缺陷分析
常用的python文件創(chuàng)建和讀寫(xiě)方法,是直接通過(guò)內(nèi)置的open函數(shù)創(chuàng)建一個(gè)文件。這里如果是使用with語(yǔ)法來(lái)創(chuàng)建的,結(jié)束語(yǔ)句后會(huì)自動(dòng)關(guān)閉被打開(kāi)的對(duì)象。而如果是直接使用open函數(shù)來(lái)定義一個(gè)對(duì)象,則需要在任務(wù)結(jié)束時(shí)手動(dòng)的執(zhí)行close操作。以下演示內(nèi)置函數(shù)open的用法及其文件操作屬性,首先創(chuàng)建一個(gè)名為file-test.py的文件:
# file-test.py with open('test1.txt', 'w') as file: file.write('hello world!')
該任務(wù)的內(nèi)容為:在當(dāng)前目錄下創(chuàng)建一個(gè)名為test1.txt的文件,清空該文件的內(nèi)容后,在文件中寫(xiě)入hello world!這個(gè)字符串。接下來(lái)用python3執(zhí)行該文件:
[dechin@dechin-manjaro os_security]$ python3 file-test.py
[dechin@dechin-manjaro os_security]$ ll
總用量 8
-rw-r--r-- 1 dechin dechin 83 1月 25 13:43 file-test.py
-rw-r--r-- 1 dechin dechin 12 1月 25 13:43 test1.txt
這里我們發(fā)現(xiàn),在執(zhí)行之后成功產(chǎn)生了test1.txt這個(gè)文件,其權(quán)限配置為644,與前面創(chuàng)建的file-test.py保持一致。在不清楚內(nèi)置函數(shù)open的實(shí)現(xiàn)原理時(shí),原本以為這個(gè)產(chǎn)生的文件權(quán)限配置是與當(dāng)前的py文件保持一致的。然而經(jīng)過(guò)進(jìn)一步的測(cè)試,將py文件的權(quán)限配置為440之后再重新執(zhí)行該文件:
[dechin@dechin-manjaro os_security]$ chmod 440 file-test.py
[dechin@dechin-manjaro os_security]$ ll
總用量 8
-r--r----- 1 dechin dechin 83 1月 25 13:43 file-test.py
-rw-r--r-- 1 dechin dechin 12 1月 25 13:43 test1.txt
[dechin@dechin-manjaro os_security]$ rm test1.txt
[dechin@dechin-manjaro os_security]$ python3 file-test.py
[dechin@dechin-manjaro os_security]$ ll
總用量 8
-r--r----- 1 dechin dechin 83 1月 25 13:43 file-test.py
-rw-r--r-- 1 dechin dechin 12 1月 25 13:44 test1.txt
這里從測(cè)試結(jié)果我們可以看出,python的內(nèi)置函數(shù)open產(chǎn)生的文件類型是與源py文件無(wú)關(guān)的。關(guān)于這里py文件的執(zhí)行是否需要可執(zhí)行權(quán)限,可以參考這篇博客。
改進(jìn)后的python文件創(chuàng)建方法
通過(guò)fdopen這個(gè)庫(kù)以及特殊的權(quán)限指定,我們可以設(shè)置生成文件的訪問(wèn)權(quán)限,以下直接展示一個(gè)python代碼案例:
# fdopen-test.py import os import stat file_name = 'test2.txt' flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL mode = stat.S_IRUSR | stat.S_IWUSR with os.fdopen(os.open(file_name, flags, mode), 'w') as file: file.write('hello world!')
執(zhí)行之后我們可以發(fā)現(xiàn),當(dāng)前目錄下生成了一個(gè)名為test2.txt的文件,其權(quán)限配置為600, 對(duì)照于我們?cè)诖a中設(shè)置的mode = stat.S_IRUSR | stat.S_IWUSR。這里我們先對(duì)其中的一些參數(shù)作一個(gè)解釋:os.O_WRONLY表示以只寫(xiě)的方式打開(kāi),os.O_CREAT表示創(chuàng)建并打開(kāi)一個(gè)新文件,os.O_EXCL表示如果文件已存在則報(bào)錯(cuò)。而mode中所配置的權(quán)限分別對(duì)應(yīng)rwx配置,其中USR,GRP,OTH又分別對(duì)用戶、用戶組、其他用戶進(jìn)行了細(xì)分的配置,從而我們就可以通過(guò)改變mode參數(shù)來(lái)實(shí)現(xiàn)所有種類的權(quán)限配置。
我們可以嘗試將上述用例中的mode作一個(gè)調(diào)整,比如添加一個(gè)可執(zhí)行權(quán)限變?yōu)?00:
# fdopen-test.py import os import stat file_name = 'test3.txt' flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL mode = stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR with os.fdopen(os.open(file_name, flags, mode), 'w') as file: file.write('hello world!')
又或者,我們需要為用戶組里的其他用戶添加可訪問(wèn)權(quán)限,比如640權(quán)限:
# fdopen-test.py import os import stat file_name = 'test4.txt' flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL mode = stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP with os.fdopen(os.open(file_name, flags, mode), 'w') as file: file.write('hello world!')
甚至我們也可以寫(xiě)出系統(tǒng)原生的644文件權(quán)限:
# fdopen-test.py import os import stat file_name = 'test5.txt' flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL mode = stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH with os.fdopen(os.open(file_name, flags, mode), 'w') as file: file.write('hello world!')
最后,讓我們一起看下上面這些python示例執(zhí)行后得到的結(jié)果:
[dechin@dechin-manjaro os_security]$ ll
總用量 28
-rw-r--r-- 1 dechin dechin 269 1月 25 14:58 fdopen-test.py
-r--r----- 1 dechin dechin 84 1月 25 14:11 file-test.py
-rw-r--r-- 1 dechin dechin 12 1月 25 13:44 test1.txt
-rw------- 1 dechin dechin 12 1月 25 14:44 test2.txt
-rwx------ 1 dechin dechin 12 1月 25 14:48 test3.txt
-rw-r----- 1 dechin dechin 12 1月 25 14:56 test4.txt
-rw-r--r-- 1 dechin dechin 12 1月 25 14:58 test5.txt
從結(jié)果中我們可以看出,所有產(chǎn)生的文件test*.txt都按照我們預(yù)期的文件權(quán)限配置生成,到這里我們就完成了所有預(yù)期的目標(biāo)。
總結(jié)概要
使用python進(jìn)行文件的創(chuàng)建和讀寫(xiě)時(shí),常規(guī)的內(nèi)置函數(shù)open得到的結(jié)果會(huì)是一個(gè)644權(quán)限的文件,這不一定能夠滿足很多對(duì)安全性需求較高的執(zhí)行環(huán)境的要求。因此我們可以通過(guò)fdopen來(lái)對(duì)所創(chuàng)建的文件進(jìn)行進(jìn)一步的權(quán)限約束,具體的操作方法可以在mode中定義一系列的權(quán)限配置,比如帶有USR的表示當(dāng)前用來(lái)執(zhí)行python文件的用戶,帶有GRP的表示用來(lái)執(zhí)行python文件的整個(gè)用戶組,而OTH則表示其他的所有的用戶。這當(dāng)中尤其是OTH這個(gè)選項(xiàng)往往是不必要開(kāi)放的權(quán)限,我們也可以根據(jù)具體的場(chǎng)景需求對(duì)創(chuàng)建的文件權(quán)限進(jìn)行配置。這里還有一點(diǎn)補(bǔ)充介紹的是,os.O_EXCL這個(gè)指令的開(kāi)啟表示如果存在同名文件就無(wú)法創(chuàng)建,需要先使用os.remove操作刪除原文件后再進(jìn)行新的文件操作,避免文件權(quán)限被覆蓋或者重用,從而導(dǎo)致創(chuàng)建的新文件權(quán)限配置與我們所預(yù)期的不符合。
到此這篇關(guān)于使用fdopen實(shí)現(xiàn)對(duì)Python進(jìn)程產(chǎn)生的文件進(jìn)行權(quán)限最小化配置的文章就介紹到這了,更多相關(guān)Python文件權(quán)限最小化配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 安裝setuptools和pip工具操作方法(必看)
下面小編就為大家?guī)?lái)一篇Python 安裝setuptools和pip工具操作方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05分?jǐn)?shù)霸榜! python助你微信跳一跳拿高分
分?jǐn)?shù)霸榜!這篇文章主要為大家詳細(xì)介紹了python助你微信跳一跳拿高分的秘籍,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01詳解Python利用APScheduler框架實(shí)現(xiàn)定時(shí)任務(wù)
在做一些python工具的時(shí)候,常常會(huì)碰到定時(shí)器問(wèn)題,總覺(jué)著使用threading.timer或者schedule模塊非常不優(yōu)雅。所以本文將利用APScheduler框架實(shí)現(xiàn)定時(shí)任務(wù),需要的可以參考一下2022-03-03Python求一批字符串的最長(zhǎng)公共前綴算法示例
這篇文章主要介紹了Python求一批字符串的最長(zhǎng)公共前綴算法,涉及Python針對(duì)字符串的遍歷、判斷、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03python數(shù)據(jù)分析之員工個(gè)人信息可視化
這篇文章主要介紹了python數(shù)據(jù)分析之員工個(gè)人信息可視化,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python可視化的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04

Python SSL證書(shū)驗(yàn)證問(wèn)題解決方案