0%

本文将介绍Windows文件系统中安全描述符(Security Descriptor)

Security Desciptor与Linux ACL

Windows安全描述符和Linux ACL(访问控制列表)都是操作系统用于管理文件和目录权限的机制。尽管它们的目的相似,但它们的实现和功能有所不同。以下是 Windows安全描述符和Linux ACL之间的一些主要区别:

  • 操作系统:Windows安全描述符用于Microsoft Windows操作系统,而Linux ACL用于基于Linux的操作系统。
  • 数据结构:Windows安全描述符使用一个复杂的数据结构,包括安全标识符(SID)、访问控制列表(ACL)和一组其他属性。Linux ACL由一系列的访问控制项(ACE)组成,每个ACE都包含一个标识符(用户或组)、权限和权限类型。
  • 继承:Windows安全描述符可以支持多层次的权限继承,文件和目录可以从父目录继承权限。Linux ACL也支持继承,但实现方式略有不同,使用默认ACL来定义新文件和目录的权限。
  • 权限管理:Windows安全描述符提供了详细的权限管理,包括读取、写入、执行、删除等多种操作。Linux ACL也提供了类似的权限管理,包括读取、写入和执行(rwx),但相对来说较为简单。
  • 权限类型:Windows安全描述符包括两种类型的 ACL,即访问控制列表(DACL)和系统访问控制列表(SACL)。DACL用于控制文件和目录的访问权限,而 SACL用于记录对象的访问事件。Linux ACL只提供一种 ACL类型,用于控制访问权限。
  • 用户和组:Windows和Linux都使用用户和组来管理权限,但它们的实现方式不同。Windows使用安全标识符(SID)来表示用户和组,而Linux使用用户 ID(UID)和组 ID(GID)。
  • 工具和命令:Windows和Linux使用不同的工具和命令来管理文件和目录的权限。Windows中常用的工具包括图形界面和命令行工具,如“icacls”和“cacls”。在Linux系统中,可以使用命令如“chmod”、“chown”和“setfacl”等来管理权限。

尽管 Windows安全描述符和Linux ACL在实现和功能上有所不同,但它们的核心目标是相同的,即为操作系统提供一种灵活、安全的权限管理机制。

阅读全文 »

Windows Server 2008以上的版本,管理员可以通过卷影副本服务(Volume Shadow Service)在指定的卷上创建备份的卷影副本。卷影副本类似于快照(Snapshot),用户可以基于快照卷恢复到之前某个时间的版本,备份软件也可基于快照做一致性备份。因此,它可以极大保护服务器的数据安全。

本文就介绍VSS相关操作以及如何用C++调用相关API。

项目完整地址见https://github.com/XUranus/Win32VSSWrapper
下文所说的卷影副本快照属于一个概念

vssadmin卷操作

所有支持VSS的Windows系统已经提供了一个管理卷影副本的命令行工具vssadmin。使用管理员权限进入cmd,执行卷影副本命令vssadmin,可以看到所有支持的命令:

C:\WINDOWS\system32>vssadmin
vssadmin 1.1 - 卷影复制服务管理命令行工具
(C) 版权所有 2001-2013 Microsoft Corp.

---- 支持的命令 ----

Delete Shadows - 删除卷影副本
List Providers - 列出已注册的卷影副本提供程序
List Shadows - 列出现有卷影副本
List ShadowStorage - 列出卷影副本存储关联
List Volumes - 列出可以进行卷影副本处理的卷
List Writers - 列出订阅的卷影副本写入程序
Resize ShadowStorage - 调整卷影副本存储关联的大小

阅读全文 »

Alternative Data Streams (ADS)是Windows文件系统中引入的一项功能,可以为文件关联额外的数据流。这项功能的诞生原因是为了提高文件系统的兼容性和功能性,特别是与Macintosh和Unix系统创建的文件进行交互时。

在Macintosh和Unix系统中,文件可以具有多个数据流,而Windows文件系统中最初只支持一个数据流。为了使Windows文件系统与其他操作系统更兼容,Microsoft引入了ADS功能,使Windows文件系统能够处理多个数据流。这项功能可以用于存储文件的元数据,如作者、创建日期、修改日期等,还可以用于存储图像和音频文件的缩略图、元数据等。

ADS功能可以提供重要的功能和灵活性,但也带来了一些安全风险。因为ADS可以隐藏在文件中,不容易被普通的文件系统API或一些防病毒软件所发现,因此,它也可能被恶意软件利用来隐藏其存在,使得系统的安全受到威胁。

尽管如此,ADS仍然被保留在Windows文件系统中,因为它在某些应用程序和使用情况下提供了重要的功能。但是,用户和组织需要意识到ADS所带来的安全风险,并采取措施来减轻这些风险,例如使用专门设计用于检测ADS中隐藏的恶意软件的防病毒软件等。本文将介绍ADS的创建和检测,以及如何用Win32 API读写ADS。

阅读全文 »

上一篇文件我们主要介绍了Windows文件系统的基本特性及文档阅读方式,本文将介绍Windows文件系统中一种特殊的概念:指向点(Reparse Point)

回顾上一章节,我们在文件dwFileAttributes依据符号位FILE_ATTRIBUTE_REPARSE_POINT实现了一个方法:

bool StatResult::IsReparsePoint() const {
return (m_handleFileInformation.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
}

我们还没有说明这个方法的意义,该方法说明该文件是一个指向点(Reparse Point)。Reparse Point是一种特殊机制,用于实现Windows文件系统的重定向。Windows的挂载和软连接就是基于它实现的。在详解FILE_ATTRIBUTE_REPARSE_POINT之前,我们先从Windows软链接开始看起。

创建软连接

cmd.exe提供了mklink命令用于在Windows创建软链接:

C:\Users\XUranus>mklink
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径 (相对或绝对)。

阅读全文 »

最近接触Windows文件备份相关的业务,从Win32 API入手对Windows文件系统的基本概念做一个总结。学习Windows文件系统最好方式还是阅读官方文档,本文只是对相关概念进行粗浅的介绍,权当抛砖引玉。
本文完整代码见:https://github.com/XUranus/FileSystemUtil

Win32 API Doc

官方文档。文档会详细描述每一个API的入参、出参、返回的字段含义和取值范围,部分还会给出Example程序。

Windows程序开发一般使用MSVC,和GCC有不少区别。为了更有效率的学习Windows文件系统,在介绍文件系统之前,本文先给Linux转Windows的开发者介绍一下Windows的编码和文档阅读方式,磨刀不误砍柴工。

UTF-8/UTF-16

涉及字符串的Win32 API一般提供两类接口:

  • Ansi字符串接口(一般以A结尾)
  • UTF-16宽字符串接口(一般以W结尾)

例如GetFileAttributesAGetFileAttributesW

typedef _Null_terminated_ CONST WCHAR *LPCWSTR, *PCWSTR;
typedef _Null_terminated_ CONST CHAR *LPCSTR, *PCSTR;
...
DWORD GetFileAttributesA(
[in] LPCSTR lpFileName
);

DWORD GetFileAttributesW(
[in] LPCWSTR lpFileName
);

阅读全文 »