分类:
2010-03-03 09:38:38
第十一章 执行系统安全 目标要求: 监视系统的访问 在系统中切换用户 控制系统访问 限制文件中数据的访问 监视系统访问 所有系统对未授权的用户访问进行理行的监视。你能够通过运行命令或者查看log日志来查看是谁登陆了系统。 显示本地系统用户 Who命令能够列出当前登陆系统的用户。它显示任意一个登陆系统的用户名和用户设备(TTY port),登陆日期和时间。这个命令读二进制文件/var/adm/utmpx来获得这些信息以及用户从那里登陆的信息。 如果用户是通过远端登陆的话。Who命令还可以显示远端主机名或者IP地址。 #who Root console Oct 17 08:21(:0) 第2列显示用户的登陆设备。 Console 这个设备用于显示系统boot和错误消息 Pts 伪终端设备代表登陆或者窗口会话没有物理设备。 Term 串口连接的物理设备比如终端或者modem. Who命令还有比较多的参数选择比如-m参数.who –m只输出现在登陆系统的terminal window。 显示远程登陆系统的用户 Rusers命令可以输出近似于who命令的输出格式,但是它只是列出了从本地或者远端主机登陆的用户。它只显示从接受登陆主机来的用户名和主机名。 如果rpc.rusersd进程启动则远端主机只响应rusers命令。rpc.rusersd是一个返回远程用户列表的网络进程。 Rusers可以通过SMF来管理。 #svcs –a |grep rusers Online 17:00:48 svc:/network/rpc/rusers : default Rusers的命令格式 Rusers –options hostname 举一个列子 #rusers –l Root sys-02:console Oct17 08:21 (:0) 显示用户信息 显示系统中本地和远端用户的详细活动信息使用命令fnger命令。 fnger命令显示: 用户登陆名 家目录的路径 登陆时间 登陆设备名 /etc/passwd中的注释信息也就是comment信息。 登陆shell 如果用户是从远端主机登陆的显示登陆主机名和相应的空闲时间 Finger的命令格式: Finger [-bfhilmpqsw] [username…..] Finger [-l] [username@hostname1 [@hostname]] 显示用户user5的信息: #finger –m user5 如果network/finger服务是启动的就可以响应finger命令。 #inetadm |grep finger Enabled online svc:/network/finger:default 显示登陆活动的记录 Last命令输出所有的登陆登陆信息,会把最近的登陆信息排在命令输出的前面。Last命令读取2进制文件/var/adm/wtmpx这个文件记录了所有的login logout reboot的信息。 命令输出包括用户名,登陆设备名,用户登陆的主机名,用户登陆的日期和时间,离开的时间,总的登陆时间小时分钟,还包括reboot的次数。 #last 显示关于个别用户的信息 #last user5 只显示最后5次reboot的信息 #last -5 reboot 记录不成功的登陆记录 当用户从远端或者本地任意一种方式登陆系统,login程序核对/etc/passwd和/etc/shdaow文件看是不是授权的用户。校验用户名和密码条目。 如果用户提供的用户名和密码是在/etc/passwd中正确的login授权用户登陆。 如果用户提供的用户名和密码是在/etc/passwd中不正确的login不让用户登陆。 尝试登陆失败的记录在/var/adm/loginglog文件。默认情况下这个文件是不存在。当你登陆以后可以通过root用户来创建这个文件。文件属于sys组。 #touch /var/adm/loginlog #chown root:sys /var/adm/loginlog #chmod 600 /var/adm/loginlog 连续5次登陆失败后所有的登陆错误的命令行都会自动的记录到这个文件。(在solaris8上实验过,没有问题) Loginlog文件记录了任意一次错误登陆的记录。这个记录包含用户名,登陆设备(TTY port)和错误登陆时间。 如果连续5次错误登陆信息未记录在/var/adm/loginlog文件中。请尝试修改/etc/default/login文件中的syslog_failed_login参数。 Tail -15 /etc/default/login #syslog_failed_login=5 切换系统用户 你可以避免直接使用root用户登陆。首先可以预防一些非授权用户的访问,以及减少缺少root用户时系统的维护,还有通过一般用户登陆执行理性操作时,减少系统错误发生的概率。 介绍su命令 使用su命令可以在超级用户和普通用户之间进行切换。Su命令的格式: Su – username 如果没有给定用户名,su命令会尝试切换到root用户。 Su命令需要你提供合适的口令除非你是root用户。Root用户运行su命令不需要提供口令。 Su –指定为读用户所有的shell初始化文件的完全登陆。-选项改变你预期想要的用户工作环境,相当于用户直接登陆系统,同时它也可以改变用户的家目录。 使用whoami命令 使用whoami命令确认当前登陆系统的用户帐号。这个命令在/usr/ucb目录下。 $whoami User1 $pwd /export/home/user1 $su #whoami Root #pwd /export/home/user1 使用who am i命令 who am i决定登陆系统最初的用户。 $ su user5 $who am i User3 其他普通用户之间的切换 $who am i User3 $pwd /export/home/user3 $su – user5 $whoami User5 $pwd /export/home/user5 $who am i User3 $exit $pwd /export/home/user3 变成root用户 $su – #who am i User3 #whoami Root #pwd / #exit $pwd /export/home/user3 监督su的尝试 为了安全原因,你必须监视谁使用了su命令,尤其那些尝试root用户授权登陆的。你也可以通过设置/etc/default/su中的那个变量来监视su操作。 /etc/default/su中的CONSOLE变量 默认情况下/etc/default/su文件中CONSOLE变量是被忽略的,因为在这个变量前面有默认的#号。所有从console尝试su的成功和失败都被忽略不记。当注释被取消掉以后CONSOLE变量被定义到/dev/console文件上。随后,在console上成功的完成su以后就会输出信息。 /etc/default/su中的SULOG变量 在/etc/default/su中的SULOG变量是指定记录所有尝试su的信息的文件。如果这个变量没有定义,则默认的su的记录是被关闭的。 /var/adm/sulog是记录系统用户所有尝试su命令的记录。+号表示成功。-号表示不成功。 控制系统访问 通过网络可以使得更多的访问是可用的,使得远程用户得到实惠。但是,没有限制的访问和数据的共享,会产生很多的安全问题。 /etc/default/login文件 在/etc/default/login有很多的变量,在这里只是介绍了很小的一部分。 /etc/default/login文件为用户登陆系统建立了默认参数。/etc/default/login给予你在系统中一些保护root帐号的能力。你能够指定root用户通过何种设备访问,也可以不允许root用户访问。 /etc/default/login文件中的CONSOLE变量 你能够设置/etc/default/login文件中的CONSOLE变量来指定root用户的访问方式。 如果变量定义为CONSOLE=/dev/console,root用户只能通过系统的console登陆。如果root用户尝试从其他设备登陆则会产生错误消息。 Not on system console connection closed. 如果这个变量没有被定义# CONSOLE=/dev/console,则root用户可以通过任何的设备登陆。 /etc/default/login文件中的PASSREQ变量 /etc/default/login文件中的PASSREQ变量默认设置为YES当帐号被创建的时候没有指定口令,当这个帐号第一次登陆的时候需要他们输入新的口令。如果这个变量被设置为NO。则默认的用户口令为空。这个变量不能应用root用户。 FTP访问 /etc/ftpd/ftpusers文件中列出的用户是禁止通过ftp登陆访问的。在这里在介绍一下 ftp的相关内容。 ftp是telnet的“近亲”。telnet允许在远程主机上登录并使用其资源,ftp允许在本地计算机与远程主机之间传递文件。ftp是File Transfer Protocal的缩写,意为文件传输协议,它可以将远程UNIX系统上的一个或多个文件拷贝到本地计算机,也可以将本地计算机上的一个或多个文件拷贝到远程UNIX系统上。 (三) 基本文件类型 当我们使用ftp时,可简单地把文件分为两大类:文本文件和二进制文件。文本文件也称为ASCII文件,其文件内容遵循ASCII的定义,主要特征如下:ASCII文件由若干行组成;可以用操作系统显示和编辑命令来显示和编辑ASCII文件内容。二进制文件(Binary File)是指除ASCII文件以外的所有文件格式。可惜的是,不同操作系统的ASCII文件格式一般是不兼容的,ftp在不同的操作系统之间进行ASCII文件的传输时,自动进行了格式转换,而对于二进制文件来说,ftp不进行任何转换。 [注意事项] 可以将ASCII文件按二进制方式传输,但决不能将二进制文件按ASCII方式传输,否则二进制文件的内容会遭到破坏而无法使用。 (二)ftp的使用 ftp的一般运行格式如下: ftp IP地址或域名 以上的IP地址或域名是指远程UNIX主机的IP地址和域名。在本地计算机屏幕上就会出现信息,提示用户输入UNIX的用户名和口令,最后出现ftp提示符: ftp> 以后就可以在此提示符下输入ftp命令。 [注意事项] 在运行ftp之前必须保证本地计算机和远程主机间的TCP/IP协议已经连通。 (三)ftp常用命令 ftp的常用命令和解释列表如下: ftp命令 解释 ?或help [command] 命令帮助 binary 设定以二进制方式传送文件 ascii 设定以ASCII方式传送文件(缺省值) cd [directory] 改变远程目录 pwd 列出当前远端主机目录 dir [r-dir] [l-file] 显示远程目录内容,r-dir表示远程目录,l-file表示本地文件。如果有本地文件,就将结果写至本地文件 ls [r-dir] [l-file] 同dir,只是显示格式不同 lcd [directory] 改变本地目录 put file1 [file2] 将本地file1文件拷贝到远程file2 get file1 [fine2] 将远程file1文件拷贝到本地file2 mput files 将本地多个文件files拷贝到远程 mget files 将远程多个文件files拷贝到本地 status 显示当前FTP状态 !command 执行本地命令,并立即返回FTP open IP地址或域名 重新建立新的连接 close 关闭远程连接 quit或bye 退出ftp (四)ftp实例 假设远程主机的IP地址为129.6.114.201,操作系统为SCO UNIX,本地计算机为PC机,操作系统为DOS,且ftp客户端程序放在C:\FTP目录下。 [例1] ftp的运行 c: cd \ftp ftp 129.6.114.201 (输入UNIX用户名和口令,会出现提示符 ftp> [例2] 将本地计算机C:\DOS目录下的help.hlp拷贝到远程主机的/usr/xyw/tmp目录下。 命令如下: ftp> binary ftp> lcd c:\dos ftp> cd /usr/xyw/tmp ftp> put help.hlp [例3] 将本地计算机C:\TEMP\TO目录下的所有文件拷贝到远程主机的/usr/xyw/tmp目录下。命令如下: ftp> binary ftp> lcd c:\temp\to ftp> cd /usr/xyw/tmp ftp> mput *.* [例4] 将远程主机的/usr/xyw/bin/dispdate文本文件拷贝到本地计算机C:\TEMP\FROM目录下。命令如下: ftp> ascii ftp> lcd c:\temp\from ftp> cd /usr/xyw/bin ftp> get dispmesg [例5] 将远程主机的/usr/xyw/doc目录下的所有文件按文本文件格式拷贝到本地计算机C:\TEMP\FROM目录下。命令如下: ftp> ascii ftp> lcd c:\temp\from ftp> cd /usr/xyw/doc ftp> mget * [例6] ftp的退出 ftp> close ftp> quit ftp> bye 默认的/etc/ftpd/ftpusers中的用户为: Root Daemon Bin Sys Adm Lp Uucp Nuucp Smmp Listen Gdm Webservd Nobody Noaccess Nobody4 这个文件中的内容你可以添加,但是添加的内容必须匹配/etc/passwd文件。 /etc/hosts.equiv和$HOME/.rhosts文件 一般的,当一个远程用户需要登陆访问到一个本地主机,本地主机读的第一个文件是/etc/passwd文件。从远程登陆的用户在文件中都有一个已经生效的条目。如果有一个密码和这个用户关联。那么,用户就必须提供正确的密码才能访问系统。 当用户名不在远程主机的/etc/passwd中,则访问拒绝。 /etc/hosts.equiv和$HOME/.rhosts文件是另外一种使用基本密码验证的方法。如果远程用户允许访问本地主机,则和本地用户一致。 这些文件提供一个远程鉴定程序来进行决定。 这个程序第一个检查/etc/host.equiv文件,然后在需要访问本地用户的home目录检查$HOME/.rhosts文件。基于这两个文件包含的信息(如果他们存在),决定是否允许用户访问系统。 /etc/hosts.equiv文件适用于整个系统,而个别用户可以在他们的home目录中维护他们自己的$HOME/.rhosts文件。 /etc/hosts.equiv和$HOME/.rhosts中的条目 /etc/hosts.equiv和$HOME/.rhosts文件具有相同的格式时,相同的条目在不同的文件中有不同的效果。 常规格式包括下面的条目 2个文件都有一个一行的条目,他们可能是下面条目中的一种: hostname hostname username + 如果只使用了hostname,则从访问的主机过来的用户拥有相同的UID则不需要口令。 如果hostname和username都使用了,那么只有指定的远程用户从指定的远程主机可以访问到本地主机 一个文件中只包含了一个单独的加号,任何一个在网络上的远程主机是被信赖的。 /etc/hosts.equiv文件 对于正常的用户,/etc/hosts.equiv文件通常是定义远程主机和远程用户是被信赖的 如果本地主机的/etc/hosts.equiv文件包含一个远程主机名,那么在远程主机上的所有的正常用户是被信赖的并且不需要密码就可以登陆到本地主机。每个远程用户在本地主机的/etc/passwd中得到确认的;其他的都被拒绝访问。 这在正常用户在多个不同系统上有帐号的情况下是非常有用的,排除在网络上传送二进制密码的安全风险。 /etc/hosts.equiv文件默认是不存在的,如果远程用户需要访问本地主机的话,就建立文件。 $HOME/.rhosts文件 /etc/hosts.equiv文件适用于广泛的非root用户,.rhosts则适用于指定的用户所有的用户包括root,都可以自己的home目录中建立并且维护他们自己的.rhosts文件 $HOME/.rhosts文件默认是不存在的,需要用户在自己的home目录中建立。 限制访问数据文件 当你建立了登陆限制以后,下一步就是控制系统中数据文件的访问。当然,一些用户需要读系统中多种文件,其他用户需要更改和删除文件以及一些文件并不能被普通用户访问。 需要共享文件的用户可以将他们放到同一个组中在/etc/group文件中。 决定用户的组成员 Groups命令用来显示组中的成员。 Groups命令的格式: Groups [username] 例如: #groups Other root bin sys adm uucp #group user5 Staff class sysadmin 标示用户帐号 使用id命令可以更多的鉴别用户。可以列出他们的UID,用户名,GID和组名。当解决用户的文件访问问题时,这个命令比较有用。 Id命令返回EUID和用户名以及EGID和登陆名。如果user1登陆入系统,然后使用su命令变更为user4,那么id命令返回的是user4的信息。 Id 命令的格式: Id options username $id Uid=101(user1) gid=300(class) 如果想看关于用户的第2个组的相关信息可以使用-a参数。 $id –a user1 改变文件和目录的属主 你或许需要使用chown命令改变一个文件或者目录的所有者给其他的用户。默认的,只有root才能够改变任何文件或者目录的所有者。 chown的命令格式: chown [option(s)] user_name filename(s) chown [option(s)] UID filename(s) 注意:用户必须是/etc/passwd中存在的。 例如: #cd /export/home/user1 #touch file7 #ls –l file7 #chown user9 file7 #ls –l file7 例子2: $ls –lR dir4 $chown –R user2 dir4 $ls –lR dir4 $chown user3:class file2 $mkdir dir4 $chown –R user3:class dir1 $ls –lR dir1 更改文件和目录的组成员 root用户或者文件的属主可以通过命令chgrp来更改文件或者目录的组。更改的文件的用户必须属于新的组。 Chgrp命令的格式: Chgrp groupname filename(s) Chgrp GID filename(s) 注意:组名必须是在/etc/group中存在的。 例如: #ls –l file4 #chgrp class file4 #ls –l file4 使用文件许可 有三种类型的特定许可应用于可执行文件和目录。 setuid许可 setgid许可 Sticky Bit许可 setuid许可 当setuid设置在一个可执行文件上的时候,运行这个可执行文件的用户或者进程就被替换为启动这个可执行文件的用户的所属文件的访问权限。(通常是root) 使用ls命令查看setuid: #ls –l /usr/bin/su -r-sr-xr-x 1 root sys ……………. Setuid的标志在用户执行权限位置是一个“s” Root用户和所有者可以利用chmod命令和8进制数值4###设置setuid许可在一个可执行文件上 例子: #chmod 4555 executable_file 查找已经设置了setuid许可的文件的全路径,执行下面的命令 #find / -perm –4000 setgid 许可 setgid许可与setuid是类似的除了有效的用户GID或者进程是改变文件的所有组。同样,分配到其他组的反问许可也是基于所有组的。 使用ls命令查看setgid: #ls –l /usr/bin/write -r-xr-sr-x 1 root tty…………………………….. Setgid许可显示一个“s”在组执行权限的位置。 Root用户和所有者可以使用chmod命令和8进制数值2###设置setgid许可在一个可执行文件上 例子: #chmod 2555 executable_file 共享目录 setgid在建立共享目录时是非常有用的。 当setgid许可应用到一个目录时,文件建立在属于该组所属的目录。 如果一个用户在目录中可写并且在那建立了一个文件。那个文件属于相同的组被看作一个目录,并且没有用户组。 建立一个共享目录,必须建立setgid #chmod g+s share_directory 搜索已经存在了setgid的文件和目录 #find / -perm –2000 Sticky Bit许可 Sticky Bit是在公共可写目录中保护文件的特殊许可。 如果一个目录有sticky Bit设置,一个仅仅可以被文件的所有者,目录的所有者或者root删除。这可以防止一个用户在公共可写目录中删除其他用户的文件。 使用ls命令查看Sticky Bit: #ls –ld /tmp Drwxrwxrwt 6 root sys Sticky Bit显示是一个“t”在other的执行区域。 Root用户和所有者可以使用chmod命令和8进制数值1###设置Sticky Bit许可在目录上 例子: #chmod 1777 public_directory 搜索已经设置了Sticky Bit许可的目录 # find / -type d –perm -1000 (附录:ACL相关内容) 访问控制列表(ACLS)当传统的文件保护不足的情况下可以提供对文件访问更加优化的控制。 一个ACL能够提供更好的安全设置通过你为文件所有者,文件组,其他特殊用户和组定义的访问许可。ACL同样还可以为每一个种类设置默认的许可。 例如:如果系统管理员希望每一个在特定组中的成员可以读一个文件,可以简单的为这个组设置这个文件的读许可。 无论如何,如果系统管理员希望只有一个人可以对这个文件进行写操作呢?ACLs可以提供这种级的安全,而传统的UNIX文件系统的保护则不能提供这个功能。 ACL扩展了标准的UNIX的访问许可。 ACL信息是保存的并且使每一个文件或者目录联系起来。 ACL命令和选项: Getfacl filename(s) 显示在一个文件上的ACL条目。 Setfacl options filename 在一个文件上设置,增加,修改和删除ACL条目。 Setfacl –m acl_entries 在文件上创建或修改ACL条目。 Setfacl –s acl_entries 删除旧的ACL条目用新的ACL条目代替旧的。 Setfacl –d acl_entries 在一个文件上删除一个或多个ACL条目。 Setfacl –f acl_file 指定一个ACL设置文件包括在其他文件上设置的许可列表。acl_file仅仅是这个命令的一个变量 Setfacl –r 为ACL mask的重新计算许可。 允许在ACL 上指定mask是被忽略的和被替代的,当需要给任何增加的用户,所有者,组和在ACL 上增加的组的条目给予访问的最大允许设置的时候。 ACL条目: Entry-type:为文件所有者,所有者组,指定用户,增加的组和ACL mask的条目设置许可。 UID or GID:用户名或UID,组名或GID Perm:条目类型的许可设置。你能够通过字母:r,w,x来设置也可以通过8进制数字0-7来设置。 Setfacl命令使用这些ACL条目在文件上设置文件的许可。 例如: u[ser]::perm ----------设置所有者的许可。 。g[roup]::perm---------设置所有者所在组的许可。 o[ther]:perm-----------设置用户许可,除了所有者或者所有者所在组的成员。 U[ser]:UID:perm or u[ser]:username:perm--------为指定用户设置许可。这个用户必须在/etc/passwd下存在。 G[roup]:GID:perm: or g[roup]:groupname:perm---------为指定的组设置许可。这个组必须在/etc/group中存在。 M[ask]:perm----------------设置ACL mask。Mask条目需要最大的许可允许所有的用户,除了所有者和所有组。Mask是为所有用户和组改变权限的快速的方法。 为文件增加和修改ACL许可: 你能够使用setfacl –m为一个或多个文件增加和修改ACL条目。 命令格式: setfacl –m acl_entry,acl_entry filename1 [filename2 …] 例如: setfacl –m user:user8:6 file.txt 查看已有文件的ACL: 查看已有文件的ACL有2中方式: 1. 使用getfacl命令。 2. 使用ls –l 命令。 使用ls –l显示的时候,任何已经有一个ACL的文件都权限模式的末端附加一个“+”。 注意:如果一个文件为增加的用户和组没有设置ACL这个文件被考虑到的细小的ACL文件,这个“+”是不显示的。 删除文件的ACL条目: 从一个文件上删除ACL条目。使用命令setfacl –d 命令。一个ACL条目能用一个或者多个逗号分开没有许可的ACL条目。删除ACL条目要指定条目类型的UID(用户名)GID(组名)。 文件所有者,文件组所有者,其他和ACL mask不能删除ACL条目。 命令格式 setfacl –d ACL_entry filename(s) or setfacl –d ACL_entry,ACL_entry filename(s) 例如: setfacl –d u:user8 file.txt 替换文件的ACL条目: 要从命令行重新定位文件上的ACL条目,最少必须指定设置的用户,组,其他和mask许可及文件名。 命令格式 setfacl –s u::perm,g::perm,o:perm,m:perm,[u:UID:perm],[g:GID:perm] filename(s) |