NTFS权限继承、所有者变化对权限的影响、create owner的权限

回头去看上一篇日志,流水账一样,看得人发昏。

简单来说就4件事:

硬盘对拷源盘和目标盘弄反导致数据丢失,安装SQL Server 2005未事先查清需要的先决条件,过度滥用重装系统浪费时间还解决不了问题,表达不严谨引起误会。

抛开公司不严谨的流程和规定,技术不成熟和盲目冒进是必须吸取的教训。

 

本周是NTFS权限的问题

一个部门的文件夹访问权限丢失。

NTFS继承、阻止继承还有强制夺取所有者对原来权限的影响还需要实验验证。

一、父对象权限的变化如何影响已经明确取消继承的子对象权限

a对父对象有适当权限的用户强制子对象继承权限会覆盖掉子对象明确定义过的权限

b)子对象手动勾选继承父对象权限不会清除子对象已经明确定义过的权限

c)父对象权限的变化不会影响已经取消继承子对象的权限

二、如何确保新账号的权限应用到所有的子对象

强制子对象继承,但会清除子对象原有的权限

三、强制下推权限和原有的权限的影响是叠加还是覆盖

覆盖

四、所有者的改变对权限的影响

a)原有的所有者手动更改所有者不会改变权限

b)强制夺取所有者不会改变权限,但是强制夺取所有者的目的在于改变权限

五、如何限制域中能够夺取所有者的成员

组策略:计算机配置 安全设置 本地策略 用户权限分配 取得文件或其他对象的所有权

 

ceater owner拥有的权限是仅子文件夹和文件的完全控制权限

某一用户组不显示任何权限是对当前对象没有权限而对其子对象有权限

 

共享和NTFS最严格的权限是最终非本地访问的权限,共享做不到严格,一个共享就只至少要打开domain usre或者autheticated user写的权限

 

实验搞清楚上面的问题后就可以一步步出自己的操作造成的影响:

用户打开文件access deny->检查用户所在组对文件所在的文件夹权限列表为空:被用户自己修改过。文件夹默认会继承上层folder的权限。如果用户所在组没有上层folder的权限这里不会出现用户所在的组(用户如果想自己加它进来必定会给读或写的权限)而create owner只会是人而不会是组。用户应该是不想别人看到他建的文件夹而尝试修改权限但修改过程中出错了。

尝试给用户加文件夹的权限->域管理员没有文件夹父对象的任何权限->文件夹继承而来的权限就没有domain admin的权限->继续往上层目录走->domain admin有full的权限->

尝试下推->覆盖掉子对象明确定义过的权限->导致权限最大化,用户所在组所有人看到文件夹下所有子对象内容

 

这件事情两个原因,一个不仔细看系统弹框,英文的系统内容多术语复杂引起的吧;第二是对ntfs权限了解得不够深入

吸取的教训是:权限最大化了

 

这件事情也很清楚了,用户以create owner的身份误操作引起的权限错误

 

Linux内核支持多种不同的文件系统类型,包括ext4、NTFS、FAT、XFS等等。这些文件系统类型的实现代码可以在内核源码中找到,并对其进行逐行介绍。 以下是一个示范的文件系统实现,名为"myfs": 1. 首先定义了一些预处理指令,包括头文件和一些常量定义: ``` #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/buffer_head.h> #define MYFS_MAGIC_NUMBER 0x13131313 #define MYFS_DEFAULT_BLOCK_SIZE 4096 #define MYFS_FILENAME_MAX_LEN 256 ``` 2. 然后定义了一个结构体,用于存储文件系统的元数据信息: ``` struct myfs_sb_info { __u32 magic_number; __u32 block_size; __u64 inode_count; __u64 block_count; __u64 free_blocks; __u64 free_inodes; struct mutex lock; }; ``` 其中,magic_number是一个用于标识该文件系统类型的数字;block_size是文件系统使用的块大小;inode_count和block_count分别表示文件系统中的inode和block数量;free_blocks和free_inodes表示可用的block和inode数量;lock是用于保护元数据结构的互斥锁。 3. 接下来定义了一个inode结构体,用于表示文件或目录的属性信息: ``` struct myfs_inode_info { __u32 mode; uid_t uid; gid_t gid; __u64 size; __u64 atime; __u64 mtime; __u64 ctime; __u32 block_count; __u32 blocks[MYFS_DEFAULT_BLOCK_SIZE / sizeof(__u32)]; struct inode vfs_inode; }; ``` 其中,mode表示文件或目录的访问权限;uid和gid表示文件或目录的所有者和所属组;size表示文件大小;atime、mtime和ctime表示文件或目录的访问、修改和创建时间;block_count表示该文件或目录使用的block数量;blocks数组存储了该文件或目录所使用的所有block的编号;vfs_inode是用于与VFS交互的inode结构体。 4. 接下来定义了一些用于读取和写入磁盘的函数: ``` static int myfs_read_block(struct super_block *sb, void *buf, __u64 block_no); static int myfs_write_block(struct super_block *sb, void *buf, __u64 block_no); ``` 这些函数使用了内核提供的缓冲区头结构体(buffer_head)来读写磁盘块。 5. 定义了用于初始化文件系统的函数: ``` static int myfs_fill_super(struct super_block *sb, void *data, int silent); ``` 该函数用于读取文件系统的元数据信息,并填充超级块结构体(super_block)。 6. 接下来定义了一些用于VFS操作的函数: ``` static struct inode *myfs_inode_lookup(struct inode *parent_inode, struct dentry *child_dentry, unsigned int flags); static int myfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool excl); static int myfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode); static int myfs_rmdir(struct inode *dir, struct dentry *dentry); static int myfs_unlink(struct inode *dir, struct dentry *dentry); static int myfs_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry); static ssize_t myfs_file_read(struct file *filp, char *buf, size_t count, loff_t *pos); static ssize_t myfs_file_write(struct file *filp, const char *buf, size_t count, loff_t *pos); static int myfs_mmap(struct file *filp, struct vm_area_struct *vma); ``` 这些函数实现了VFS的各种操作,例如查找inode、创建和删除文件或目录、读写文件、内存映射等。 7. 最后定义了用于注册文件系统的函数: ``` static struct file_system_type myfs_fs_type = { .owner = THIS_MODULE, .name = "myfs", .mount = myfs_mount, .kill_sb = myfs_kill_sb, }; static int __init myfs_init(void) { int ret = register_filesystem(&myfs_fs_type); if (ret) { printk(KERN_ERR "myfs: Failed to register filesystem (error %d)\n", ret); return ret; } printk(KERN_INFO "myfs: Filesystem registered successfully\n"); return 0; } static void __exit myfs_exit(void) { int ret = unregister_filesystem(&myfs_fs_type); if (ret) { printk(KERN_ERR "myfs: Failed to unregister filesystem (error %d)\n", ret); } printk(KERN_INFO "myfs: Filesystem unregistered successfully\n"); } module_init(myfs_init); module_exit(myfs_exit); ``` 这些函数定义了文件系统类型,注册和注销文件系统。 以上就是一个简单的示范文件系统的实现。在实际的文件系统实现中,还需要处理更多的细节和异常情况,例如文件系统的格式化、坏块处理、权限检查、错误恢复等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值