使用fdopen實現(xiàn)對Python進程產(chǎn)生的文件進行權限最小化配置
需求背景
用python進行文件的創(chuàng)建和讀寫操作時,我們很少關注所創(chuàng)建的文件的權限配置。對于一些安全性較高的系統(tǒng),如果我們創(chuàng)建的文件權限其他用戶或者同一用戶組里的其他用戶有可讀權限的話,有可能導致不必要的信息泄漏的風險。因此,除了創(chuàng)建一個更加安全和隱私的個人環(huán)境之外(如容器環(huán)境等),我們還可以對生成的文件的配置進行權限最小化處理。
常用方法及其缺陷分析
常用的python文件創(chuàng)建和讀寫方法,是直接通過內(nèi)置的open函數(shù)創(chuàng)建一個文件。這里如果是使用with語法來創(chuàng)建的,結束語句后會自動關閉被打開的對象。而如果是直接使用open函數(shù)來定義一個對象,則需要在任務結束時手動的執(zhí)行close操作。以下演示內(nèi)置函數(shù)open的用法及其文件操作屬性,首先創(chuàng)建一個名為file-test.py的文件:
# file-test.py with open('test1.txt', 'w') as file: file.write('hello world!')
該任務的內(nèi)容為:在當前目錄下創(chuàng)建一個名為test1.txt的文件,清空該文件的內(nèi)容后,在文件中寫入hello world!這個字符串。接下來用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這個文件,其權限配置為644,與前面創(chuàng)建的file-test.py保持一致。在不清楚內(nèi)置函數(shù)open的實現(xiàn)原理時,原本以為這個產(chǎn)生的文件權限配置是與當前的py文件保持一致的。然而經(jīng)過進一步的測試,將py文件的權限配置為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
這里從測試結果我們可以看出,python的內(nèi)置函數(shù)open產(chǎn)生的文件類型是與源py文件無關的。關于這里py文件的執(zhí)行是否需要可執(zhí)行權限,可以參考這篇博客。
改進后的python文件創(chuàng)建方法
通過fdopen這個庫以及特殊的權限指定,我們可以設置生成文件的訪問權限,以下直接展示一個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),當前目錄下生成了一個名為test2.txt的文件,其權限配置為600, 對照于我們在代碼中設置的mode = stat.S_IRUSR | stat.S_IWUSR。這里我們先對其中的一些參數(shù)作一個解釋:os.O_WRONLY表示以只寫的方式打開,os.O_CREAT表示創(chuàng)建并打開一個新文件,os.O_EXCL表示如果文件已存在則報錯。而mode中所配置的權限分別對應rwx配置,其中USR,GRP,OTH又分別對用戶、用戶組、其他用戶進行了細分的配置,從而我們就可以通過改變mode參數(shù)來實現(xiàn)所有種類的權限配置。
我們可以嘗試將上述用例中的mode作一個調整,比如添加一個可執(zhí)行權限變?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!')
又或者,我們需要為用戶組里的其他用戶添加可訪問權限,比如640權限:
# 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!')
甚至我們也可以寫出系統(tǒng)原生的644文件權限:
# 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í)行后得到的結果:
[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
從結果中我們可以看出,所有產(chǎn)生的文件test*.txt都按照我們預期的文件權限配置生成,到這里我們就完成了所有預期的目標。
總結概要
使用python進行文件的創(chuàng)建和讀寫時,常規(guī)的內(nèi)置函數(shù)open得到的結果會是一個644權限的文件,這不一定能夠滿足很多對安全性需求較高的執(zhí)行環(huán)境的要求。因此我們可以通過fdopen來對所創(chuàng)建的文件進行進一步的權限約束,具體的操作方法可以在mode中定義一系列的權限配置,比如帶有USR的表示當前用來執(zhí)行python文件的用戶,帶有GRP的表示用來執(zhí)行python文件的整個用戶組,而OTH則表示其他的所有的用戶。這當中尤其是OTH這個選項往往是不必要開放的權限,我們也可以根據(jù)具體的場景需求對創(chuàng)建的文件權限進行配置。這里還有一點補充介紹的是,os.O_EXCL這個指令的開啟表示如果存在同名文件就無法創(chuàng)建,需要先使用os.remove操作刪除原文件后再進行新的文件操作,避免文件權限被覆蓋或者重用,從而導致創(chuàng)建的新文件權限配置與我們所預期的不符合。
到此這篇關于使用fdopen實現(xiàn)對Python進程產(chǎn)生的文件進行權限最小化配置的文章就介紹到這了,更多相關Python文件權限最小化配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python 安裝setuptools和pip工具操作方法(必看)
下面小編就為大家?guī)硪黄狿ython 安裝setuptools和pip工具操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05詳解Python利用APScheduler框架實現(xiàn)定時任務
在做一些python工具的時候,常常會碰到定時器問題,總覺著使用threading.timer或者schedule模塊非常不優(yōu)雅。所以本文將利用APScheduler框架實現(xiàn)定時任務,需要的可以參考一下2022-03-03python實現(xiàn)人臉識別經(jīng)典算法(一) 特征臉法
這篇文章主要為大家詳細介紹了python實現(xiàn)人臉識別經(jīng)典算法,特征臉法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03