更新中…
题1 传统UNIX 权限控制
UNIX系统在设计早期坚持权限设计简单。传统UNIX权限控制特点至今在沿用,以下列举几个基本特征
特征 | 说明 | 备注 |
---|---|---|
控制对象 | 文件 进程 | 对象owner拥有广泛的操作权限 |
创建对象 | — | 新创建的对象owner为创建者 |
root用户 | — | root用户可以扮演任何用户的owner |
系统管理 | — | 只有root用户可以进行系统管理操作 |
文件权限
jianleya@ubuntu:~/lab$ ls -al
-rw-rw-r-- 1 jianleya jianleya 110 Oct 14 23:55 file
-rw-rw-r-- 1 jianleya jianleya 144 Oct 14 23:55 new
进程权限
进程有6个属性基本ID:(详细参见进程管理一节)
a real,effective,and save UID;a real , effctive and saved GID
real ID 和GID用户身份验证
effective ID 和GID用于权限验证(通常real ID和effective ID是相同的)EGID(primary group )和用户组关系列表决定文件的访问权限。GID却很少用到,有的系统上创建新文件时可能会使用GID为文件所属用户组
Saved ID 和GID并没有得到直接的作用
超级用户
超级用户又名root用户,在UNIX系统中是UID定义为0(通常系统并不禁止定义其它UID为0的用户,但是无疑这是一个十分糟糕的做法)
传统UNIX允许超级用户(that is, any process whose effective User ID is 0)对任何文件进行任何操作
root用户通常具有如下列举的特权
- 通过chroot命令,改变根目录
- 创建设备文件
- 设置系统时钟
- 修改资源上限和进程优先级
- 设定主机名称
- 配置网络接口
- 打开需要授权的网络端口
- 关机/重启
root用户一项有趣的特权是改变进程的UID GID. login 程序初始状态一般是root身份运行,用户键入的用户名和口令匹配时,修改自身UID和GID-----降级成为普通用户
设计评价
传统UNIX权限设计使用几页文档即可描述清楚,并且经受了时间的考验。它简洁,可预测,可以胜任大多数权限应用。
所有的UNIX和Linux变种继续支持这一模型,并且是使用最广泛和默认的管理方式
题2 现代权限控制
传统UNIX权限管理缺点
- 安全隐患,超级用户权限过大。root账户一旦被攻克,系统面临的伤害将不可控制
- 对于设置seuid位的可执行程序(owned by root),因为权限提升为root,这些程序也应当仔细编写,避免安全漏洞。但是重新编写并自己维护系统管理相关的应用是不现实的。
- 高度保密的环境,譬如美国政府要求禁止特权用户降低文档的使用权限(传统UNIX系统是无法满足这种要求的----文档的owner或者超级用户可以随意更改文件的权限)
- 权限审计功能缺失 借助/etc/group 可以方便的了解用户属于哪些用户组,但是这些组赋予用户哪些权限却没有办法直接看到
现代权限管理设计
-
基于角色的权限控制
全称 Role-based access control,又称RBAC,1992年由David Ferraiolo and Rick Kuhn提出的理论模型。
模型权限管理不再直接分派给User,而是检查User扮演的角色(role),系统首先枚举用户扮演的角色列表,然后检查是否存在一个角色具备操作权限
过程上有点类似用户和用户组的关系,但相比用户组它的功能更加实用:- 用户和用户组 模型只适用于对本地系统的资源权限管理,role却不限于此
- 角色和角色之间可以存在层级关系,这样大大简化的权限管理
- role机制分解超级用户权限为多个角色,大大降低root给系统带来的风险
Solaris 系统利用groups(/etc/group) ,authorizations(/etc/security/auth_attr),profiles(/etc/security/prof_attr), 用户,授权,预置文件之间的绑定关系(/etc/user_attr)实现role。 支持的命令如:roleadd roledel roldmod
2008年 5月,Open Solaris build 99 之后,Solaris 系统已经健壮到可以没有root用户
HP-UX role管理工具如:roleadm authadm cmdprivadm privrun privedit
AIX role管理工具如:mkrole chrole rmrole rolelist swrole -
SELinux:安全升级型 Linux
SELinux 2000年底开始的一个自由软件项目 NSA项目,集成到2.6内核版本,所以大多数当前发行Linux系统都支持该功能。有的发行版本使能了该功能(但是通常不在工作状态)
SELinux的主要目的是实现“mandotory access control”,即手动权限控制。所欲的权限都由系统管理员指定,用户无权控制访问控制属性(这种系统通常也只有特殊场合和应用到)
SELLinux也可以用来实现角色控制系统… -
POSIX 能力(Linux)
Linux 系统,理论上都可以将root账号的特权按照POSIX标准规定的能力进行进一步的细分。权限不仅可以指定给用户,同时可以指定给可执行程序,相对一种变向的setuid,不过风险更低。从实际使用情况看,该功能并不实用 -
PAM (身份验证)
用来验证用户身份,而不是用来验证权限
传统用户身份验证是用户键入用户名 密码,系统验证是否匹配
PAM 全称 Pluggable Authentication Modules,PAM可以支持多种身份验证方式,网络验证,生物识别等。PAM本质上是一个库,而不是具体的身份识别算法。更具体的来说用户首先调用PAM的接口,然后PAM调用具体的身份验证接口,这个角度看PAM更像一个打包器 -
权限控制列表 ACL
传统文件系统权限由 用户/用户组模型,ACL是对该模型的文件系统的推广。
目前有两种主要形式:一个是早期POSIX 草案标准,虽然一直没有正式批准,却得到广泛实现
另一个是NFSV4,基于windows ACL来制定
权限控制 实际应用
- 使用root账户登录
root账户不会留下使用过的命令记录,系统被破坏后无从追查破坏系统执行过的命令
如果有多个用户知道root口令,那么很难确认是谁使用root登录或什么时间
一般系统除了控制台,都会禁止窗口系统,网络系统进行root登录 - su 命令
用户切换命令,需要输入目标用户的密码。虽然切换为root后不会记录root身份执行的指令,但是至少su指令会被记录在什么时间,由谁执行
养成良好的习惯使用/bin/su或者 /user/bin/su 切换用户,因为有可能有恶意软件尝试窃取用户口令 - sudo 命令
sudo 解决了查明谁在使用,做了什么的问题
sudo在当下的UNIX 或者Linux系统上都得到了很好的支持(即使Solaris基于RBAC系统,也实现了pfexec的命令拥有类似sudo功能)
sudo 保留一个自己的log,用于解决记录谁在什么时间在哪台机器上进行什么操作的问题。通常记录在syslog或者logfile,logfile配置参考:logfile
/etc/sudoers 配置参考链接: - root之外的伪用户
root用户UID为0,一般用户UID一般从1000开始;UID小于10一般为系统账户,UID在10到100之间为伪用户
特征:
/etc/shadow 配置文件秘钥通常设置为 * , 表示禁止用户登录
设置SHELL为/bin/fause /bin/nologin 禁止远程登录例如SSH
… - 口令保险柜
su/sudo 解决的都是计算机系统账户的问题。随着不断涌现的新需求,口令保险柜成为一种新的口令登录形式: - 网页登录,路由器/防火墙,管理员远程服务
- 计算机运算速度越来越快,破解简单口令越来越快,因此需要更加安全的口令系统
- 用户登录需要一个可靠的系统跟踪记录,同一个账户只允许一个人登录,并且禁止root这类用户…
口令保险柜实现
需求 | 举例 | 说明 |
---|---|---|
个人使用,免费 | KeePass | 密码本地存储/有权限查看所有秘钥要么没有任何查阅权限/没有记录功能 |
企业使用,收费 | CyberArk | 根据用户来进行收费或者记录的密码数量来收费 |
本文整理自UNIX and Linux System Administration Handbook(4 Edition)