需求背景

用python进行文件的创建和读写操作时,我们很少关注所创建的文件的权限配置。对于一些安全性较高的系统,如果我们创建的文件权限其他用户或者同一用户组里的其他用户有可读权限的话,有可能导致不必要的信息泄漏的风险。因此,除了创建一个更加安全和隐私的个人环境之外(如容器环境等),我们还可以对生成的文件的配置进行权限最小化处理。

常用方法及其缺陷分析

常用的python文件创建和读写方法,是直接通过内置的open函数创建一个文件。这里如果是使用with语法来创建的,结束语句后会自动关闭被打开的对象。而如果是直接使用open函数来定义一个对象,则需要在任务结束时手动的执行close操作。以下演示内置函数open的用法及其文件操作属性,首先创建一个名为file-test.py的文件:

# file-test.py

with open('test1.txt', 'w') as file:
file.write('hello world!')

该任务的内容为:在当前目录下创建一个名为test1.txt的文件,清空该文件的内容后,在文件中写入hello world!这个字符串。接下来用python3执行该文件:

[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

这里我们发现,在执行之后成功产生了test1.txt这个文件,其权限配置为644,与前面创建的file-test.py保持一致。在不清楚内置函数open的实现原理时,原本以为这个产生的文件权限配置是与当前的py文件保持一致的。然而经过进一步的测试,将py文件的权限配置为440之后再重新执行该文件:

[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的内置函数open产生的文件类型是与源py文件无关的。关于这里py文件的执行是否需要可执行权限,可以参考这篇博客

改进后的python文件创建方法

通过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!')

执行之后我们可以发现,当前目录下生成了一个名为test2.txt的文件,其权限配置为600, 对照于我们在代码中设置的mode = stat.S_IRUSR | stat.S_IWUSR。这里我们先对其中的一些参数作一个解释:os.O_WRONLY表示以只写的方式打开,os.O_CREAT表示创建并打开一个新文件,os.O_EXCL表示如果文件已存在则报错,``

我们也可以尝试将此处的mode作一个调整,比如添加一个可执行权限变为700

# 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!')

甚至我们也可以写出系统原生的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示例执行后得到的结果:

[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

从结果中我们可以看出,所有产生的文件test*.txt都按照我们预期的文件权限配置生成,到这里我们就完成了所有预期的目标。

总结概要

使用python进行文件的创建和读写时,常规的内置函数open得到的结果会是一个644权限的文件,这不一定能够满足很多对安全性需求较高的执行环境的要求。因此我们可以通过fdopen来对所创建的文件进行进一步的权限约束,具体的操作方法可以在mode中定义一系列的权限配置,比如带有USR的表示当前用来执行python文件的用户,带有GRP的表示用来执行python文件的整个用户组,而OTH则表示其他的所有的用户。这当中尤其是OTH这个选项往往是不必要开放的权限,我们也可以根据具体的场景需求对创建的文件权限进行配置。这里还有一点补充介绍的是,os.O_EXCL这个指令的开启表示如果存在同名文件就无法创建,需要先使用os.remove操作删除原文件后再进行新的文件操作,避免文件权限被覆盖或者重用,从而导致创建的新文件权限配置与我们所预期的不符合。

参考链接

  1. fdopen使用方法的问答
  2. os.open()各配置参数解释

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/fdopen.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

使用fdopen对python进程产生的文件进行权限最小化配置的更多相关文章

  1. 文件上传文件的权限--lnmp 环境配置,尤其整个项目复制过来动~~~

    site_upload  需要是自己才建立动才会是root  root  所有者:---不是root :  root   上传不了文件,不是  777 就都可以上传的,也要看看是谁建立的文件夹: 打包 ...

  2. [apue] linux 文件访问权限那些事儿

    前言 说到 linux 上的文件权限,其实我们在说两个实体,一是文件,二是进程.一个进程能不能访问一个文件,其实由三部分内容决定: 文件的所有者.所在的组: 文件对所有者.组用户.其它用户设置的权限访 ...

  3. 3,linux入门到上手-文件权限管理与配置

    linux入门-文件权限管理与配置 一.关于linux的操作命令一般格式如下: 1,一行指令中第一个输入的部分绝对是"指令(command)"或"可可执行文件案(例如批次 ...

  4. python logging 实现的进程安全的文件回滚日志类

    python标准库中的logging模块在记录日志时经常会用到,但在实际使用发现它自带的用于本地日志回滚的类 logging.handlers.RotatingFileHandler 在多进程环境下会 ...

  5. python(7)-- 文件I/O

    1 打印到屏幕:print 语句.你可以给它传递零个或多个用逗号隔开的表达式.此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出,eg:print "Python 是一个非常 ...

  6. 用Supervisord管理Python进程

    http://feilong.me/2011/03/monitor-processes-with-supervisord Supervisord是用Python实现的一款非常实用的进程管理工具,类似于 ...

  7. 使用gdb调试Python进程

    使用gdb调试Python进程 有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump.例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到 ...

  8. Python学习笔记六--文件和输入输出

    6.1文件对象 所有Python对文件的操作都是基于对文件对象的操作.那么就从文件对象的创建说起.open()[file()]提供初始化输入输出的接口.open()成功打开文件时会返回一个文件对象. ...

  9. python 进程介绍 进程简单使用 join 验证空间隔离

    一.多道程序设计技术(详情参考:https://www.cnblogs.com/clschao/articles/9613464.html) 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行 ...

随机推荐

  1. TP学习—第一天:框架的简单学习;创建应用;

    一.框架目录文件的介绍     common  核心函数库目录 conf   框架的核心配置文件 lang   语言包目录 library   核心资源库目录 tpl 不用管,就是几个模板  Thin ...

  2. angualr8 循环对象

    <div *ngFor="let item of object | keyvalue"> {{item.key}}:{{item.value}} </div> ...

  3. 你只用do-while来实现循环?太浪费了!

    这是道哥的第010篇原创 目录 前言 在宏定义中的妙用 错误的宏定义 比较好的宏定义 另一个也不错的宏定义 在函数体中的妙用 函数功能:返回错误代码对应的错误字符串 函数功能:通过TCP Socket ...

  4. 说说 Python 中的高阶函数

    高阶函数(higher-order function)指的是:接受一个函数为参数,或者把函数作为结果值返回的函数. 1 sorted() 比较常见的高阶函数是 sorted(),其内部的关键字参数 k ...

  5. matlab随机系数矩阵产生以及矩阵的可视化函数

    clc; clear all; close all; n = 100;%所产生矩阵的大小 A= sprandsym(n,0.015,0.1,1);%产生系数矩阵函数: spy(A)矩阵图形化相当于im ...

  6. vue3.0自定义指令(drectives)

    在大多数情况下,你都可以操作数据来修改视图,或者反之.但是还是避免不了偶尔要操作原生 DOM,这时候,你就能用到自定义指令. 举个例子,你想让页面的文本框自动聚焦,在没有学习自定义指令的时候,我们可能 ...

  7. 痞子衡嵌入式:MCUXpresso IDE下SDK工程导入与workspace管理机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程导入与workspace管理机制. MCUXpresso IDE是恩智浦软件团队倾注很大心血研发 ...

  8. ReentrantLock显示锁

    public class AttemptLocking { /* * public AttemptLocking() { * * System.out.println("构造器初始化...& ...

  9. filebeat7.5.2 在 windows server 2008 R2 设置系统服务报错

    今天在windows server 2008 R2 设置filebeat为系统服务报错(在 windows 10 .windows server 2012.windows server 2019下安装 ...

  10. android中VideoView播放sd卡上面的视频

    (1)videoView组件只支持MP4和3gp格式的视屏播放,如果想播放其它视屏格式的文件,还得开发能够播放的视屏播放器 (2)videoView组件功能比较单一,如果想开发功能丰富的播放器,还得重 ...