欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用fdopen實(shí)現(xiàn)對(duì)Python進(jìn)程產(chǎn)生的文件進(jìn)行權(quán)限最小化配置

 更新時(shí)間:2023年03月13日 15:11:17   作者:DECHIN  
用python進(jìn)行文件的創(chuàng)建和讀寫(xiě)操作時(shí),我們很少關(guān)注所創(chuàng)建的文件的權(quán)限配置。本文就來(lái)聊聊如何使用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 SSL證書(shū)驗(yàn)證問(wèn)題解決方案

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

    這篇文章主要介紹了Python SSL證書(shū)驗(yàn)證問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 最新評(píng)論