预计阅读本页时间:-
10.7.3 Linux中的安全实现
当用户登录的时候,登录程序login(为根用户所有且SETUID打开)要求输入登录名和密码。它首先计算密码的散列值,然后在/etc/passwd文件中查找,看是否有相匹配的项(网络系统工作得稍有不同)。使用散列的原因是防止密码在系统中以非加密的方式存在。如果密码正确,登录程序在/etc/passwd中读取该用户选择的shell程序的名称,例如可能是bash,但是也有可能是其他的shell,例如csh或者ksh。然后登录程序使用setuid和setgid来使自己的UID和GID变成用户的UID和GID(注意,它一开始的时候是根用户所有且SETUID打开)。然后它打开键盘作为标准输入(文件描述符0),屏幕为标准输出(文件描述符1),屏幕为标准错误输出(文件描述符2)。最后,执行用户选择的shell程序,因此终止自己。
到这里,用户选择的shell已经在运行,并且被设置了正确的UID和GID,标准输入、标准输出和标准错误输出都被设置成了默认值。它创建任何子进程(也就是用户输入的命令)都将自动继承shell的UID和GID,所以它们将拥有正确的UID和GID,这些进程创建的任何文件也具有这些值。
当任何进程想要打开一个文件,系统首先将文件的i节点所记录的保护位与用户的有效UID和有效GID对比,来检查访问是否被允许。如果允许访问,就打开文件并且返回文件描述符;否则不打开文件,返回-1。在接下来的read和write中不再检查权限。因此,当一个文件的保护模式在它被打开后修改,新模式将无法影响已经打开该文件的进程。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
Linux安全模型及其实现在本质上跟其他大多数传统的UNIX系统相同。