本站不再更新,欢迎光临 java开发技术网
随笔-230  评论-230  文章-8  trackbacks-0

3.2        用户,密码,文件访问权限和安全性
3.2.1  主目录, 根目录和添加新用户
 
对于一般用户来说,主目录(home directory)是硬盘上唯一可以原来写东西的地方。一般的路径名是/home/login_user_name。

主目录用于存储各种用户文件:设置文件,程序配置文件,用户文档,数据,netscape的缓存,邮件等等。作为一个普通用户,你可以在主目录下建立新的目录安排你自己的目录结构。其他用户无法阅读你的文件或者写数据到你的主目录,除非你给他们适当的权限。

除了自己的主目录以内的文件,一般用户也可以看到,阅读和执行很多系统里的文件,但是一般来说他们不能修改和删除这些文件。

root用户(也叫“超级用户”)是一个特殊的系统管理帐号,可以修改系统里的任何文件。经常使用root用户作为缺省的登录用户不是什么好习惯――你的误操作将有可能导致严重后果。建议设置一个一般用户给自己作为日常使用的帐号,只在必要使用root用户的权限时才登陆到root用户模式下。一般来说,root用户是Linux初始化安装后的唯一一个用户。

使用root用户建立一个普通用户:

adduser joe

passwd joe

[输入用户秘密]

[再次输入用户秘密确认]

 

在上述的例子里,要求超级用户root。以上命令在系统里产生一个joe的用户,接着设置该用户的密码。现在,可以告诉joe他的用户名和初始密码,然后他可以登录到系统,然后修改他的密码。还要注意的是,用户名和密码都是大小写敏感。

 

超级用户可以修改任何人的密码,尽管他/她无法阅读该用户的密码。用户密码采用单向加密算法,加密后仅仅在系统上储存加密后的密码,对于旧的系统一般存在/etc/passwd文件里,新的系统一般存在/etc/shadow文件里,未经加密的密码文件从来不被储存在系统里。当用户登录的时候,系统把用户的输入密码使用相同的加密算法得到的结果再和密码文件(/etc/passwd或者/etc/shadow)里的结果相比较。

 

超级用户和一般用户的分开使得Linux系统更加安全――甚至让病毒在Linux系统下很难有所作为(因为用户运行的程序只能把数据写到他/她自己的有读写权限的目录里,不会感染整个操作系统的核心部分)。

 

一般建议用户在第一次登录到系统的时候立刻修改自己的密码:

passwd

Changing password for joe

(current) UNIX password:   [输入旧的密码]

New password:              [输入新的密码]

Retype new password:       [重复输入新的密码]

passwd: all authentication tokens updated successfully.passwd

实际上,当你输入密码时,出于安全原因,键盘输入并不会显示在屏幕上。如果你是第一次修改密码,看不到键盘输入的结果可能会有点不适应。

在Linux里,同一个密码可以用来:

 

·         登录到文本终端

·         登录到图形用户界面(GNOME或者KDE)

·         取消锁定的文本终端

·         取消密码保护的图形用户界面下的屏幕保护(GNOME或者KDE)


3.2.2  密码安全性
 

一个“脆弱”(指容易被破解)的密码通常是安全问题的根源。即使在家里,完全有可能当你在浏览因特网的同时,黑客已经攻破你的计算机,正在修改和删除你计算机上的文件,或者通过你的计算机在本地警察局的网络里做一些令人头痛的事情。所以,即使在家里也要保证用户密码的安全。一旦有人登录到你的计算机,即使是普通用户,他也有可能找到其他方法获得超级用户的密码。其实就看你管理计算机系统的能力和黑客破解能力的较量了。

以下是一些不好的密码:

 根本没有密码 
 密码就是“password” 
 密码和登录用户名相同 
 你的名字,女儿的名字,儿子的名字,妻子的名字,丈夫的名字……或者任何一个亲人的名字。人的名字其实非常的有限――只要查一下一些类似“如何给婴儿取名”之类的书就可以了,不要以为你是印度来的就没有人知道你的名字。 
 你的姓或者其他人的姓。姓的数量比名字更加有限! 
 你家小狗的昵称,老婆的昵称等等。昵称的数量比姓更少! 
 你喜欢的体育俱乐部的名称,节日名称,牙膏的名称等等。避免使用非常出名的足球队的名称,也不要用任何摇滚乐队的名字 
 你的生日,社会保险号码,等等。 
 公司,部门,小组的名称 
 密码写在你的记事本上或者计算机壳子上 
 你在因特网联机商店使用的密码,电子邮件邮箱的密码等 
 任何在字典里可以找到的单词。英文字典其实没有包含你想象中那么多的单词(10万个单词?10万个单词的文件小于1MB!)。一个水平很一般的黑客很容易就加密所有的字典词汇然后逐一和你的密码比较。一个不可否认的事实,因特网上的确已经存在用来制造 “字典攻击”的现成工具。不信?试着找一个工具来破解你的密码看看有多容易! 
 任何其他词汇,姓,宠物或者成语,不管是哪一种语言。对于一个有经验的黑客来说,如果他已经覆盖了一种语言,稍微加工一下就可以很容易覆盖其他常用的语言。有多少常用的语言?40个?黑客只需要把预先做好的几个文件加到破解文件清单里就行了。 
 任何以上的密码在前面或者后面加上一两个数字或者字符 

一个好的密码最少要6个字符,有些专家甚至建议最少要10个字符,包含字符(最好大小写混合),数字和特殊字符(比如?,*,$,%,#),还要定期做修改(建议8到16周之间)。

不巧的是,越不好破解的密码往往越难以记住。为了解决这个问题,我花了十分钟发明了我自己的“密码公式”。比如说,我总是以“@”字符作为密码的开头和结尾,然后使用两个单词并且用“!”把它们连接起来,每一个单词的最后一个字符大写,比如“@whitE!housE@”。看起来象一个不太好记的密码,但是只要我记得自己的“密码规则”,其实可以很容易记住这个密码。当然,如果你是一个记忆的超级天才,你可以使用mkpasswd并且试着记住它 J。

系统管理员可以使用Linux自带的工具来设置密码的规则(密码最小长度,是否要求特殊字符,密码过期的期限等),以root用户运行:

linuxconf

在菜单“user account”-“policies”-“password & account policies”设置。在以下场合里,一般的用户不能设置一个密码:

 当密码长度太短 
 密码是一个字典里的单词 
 密码中不包含数字或者特殊字符 

但是对于root用户,可以设置任何密码而只接收系统的警告信息。

还要保证任何包含你的密码的文件(比如/root/.kde/share/config/kpprc)有正确,安全的权限设置,这样才能保证你的密码不会被其他人看到。举个例子,你可能要运行命令:

chmod 600 kpprc

如果你使用电话线上网,每周只用几个小时,你的密码太脆弱可能不会有什么大问题。但是如果你使用cable modem宽带上网,或者如果大部分时间你都呆在因特网上,你最好重新考虑一下你的系统安全。

有些计算机半文盲使用一些脆弱得让人惊讶的密码,根据CNN的相关报道,“大概有50%的计算机用户基于家庭成员的名字,配偶的名字或者宠物的名字作为密码。大概30%的计算机用户基于流行音乐歌手的名字或者体育明星的名字作为密码”。

http://www.cnn.com/2002/TECH/ptech/03/13/dangerous.passwords/index.html

特别要请注意的是:在以上“基础密码”后面加上一两个数字并不会使密码安全提高多少。

3.2.3  忘记了超级用户密码怎么办

尽管我从来不会忘记自己的密码,但是我还是会仔细研究一下这个专题,以防将来有一天突然看到我的母亲在阅读我的ICQ聊天记录时,可能会派上用场。

第一种办法:

最容易解决“忘记密码问题”的方法是将Linux重新启动到单用户模式,可以在“lilo”的命令提示符下输入:

linux single

这种办法将使你变成root超级用户而不需要输入任何密码。现在作为root用户,你可以使用以下命令重新设置密码(不需要输入旧的密码)

passwd

你可能觉得这实在是太不安全了!那是因为,如果有人可以物理上“访问”你的计算机硬件,没有计算机系统是安全的。但是,我并不喜欢在我的计算机上有这个“linux single”的漏洞存在,所以我在文件/etc/lilo.conf里(在 “image=”段落的尾部)加上以下内容就可以把这个漏洞拔除:

 

password=”my_password”

restricted

这个设置使得Linux启动时,在lilo的命令提示符下,当用户输入linux带任何参数时必须输入正确的密码。如果用户不是使用命令行的启动模式而使用正常的启动模式,没有密码也能够启动系统。为了让修改生效,必须重新运行lilo命令。因为我设置的密码在lilo.conf文件里没有加密,我还必须把文件/etc/lilo.conf改成只有root用户可以读写:

chmod 600 /etc/lilo.conf

第二种办法

另外一个解决“超级用户密码丢失”的办法是使用Linux启动盘或者安装CD来启动你的计算机。然后找到你计算机硬盘上的root分区,使用mount命令挂载该分区,接着修改文件/etc/shadow。因为当我从软盘启动Linux时,我可以不需要输入任何密码就成为root用户。在密码文件里,把root用户的加密密码删除,所以root的密码将是空的。

用户帐号的信息储存在以下纯文本文件里:

 

/etc/passwd

/etc/shadow

 

文件/etc/passwd包含了我计算机上的所有用户,并且很容易阅读。文件每行包含一个帐号信息,总共包含六个“:”间隔符号(这意味着七个字段)。举例如下

 

/etc/passwd文件例子

 

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

apache:x:48:48:Apache:/var/www:/sbin/nologin

                                                                                           

1
 root
 登录用户名
 
2
 x
 字符x
 
3
 0
 用户标识
 
4
 0
 该用户的优先用户组标识
 
5
 root
 注释(比如用户的全名)
 
6
 /root
 用户的主目录(HOME DIRECTORY)
 
7
 /bin/bash
 用户的shell的名字
 
真正最重要的用户信息其实储存在文件/etc/shadow文件里。这个文件相对安全因为只有root用户才能阅读。在这个文件里,每行包含九个字段:

1
 登录用户名
 
2
 加密后的密码
 
3
 从1970年1月1日到上一次修改密码的天数
 
4
 距离下一次修改密码的天数
 
5
 密码定期作修改的天数
 
6
 密码即将过期时提前通知用户的天数
 
7
 密码过期到用户被取消的天数
 
8
 密码被取消时距离1970年1月1日的天数
 
9
 预留字段

一些旧的Unix版本不包含/etc/shadow文件,而是把密码存放在/etc/passwd每行中的第二个字段。这个字段在新的系统中只显示一个“x”字符。

举个例子,我的/etc/shadow文件中的root用户看起来是这样的:

root:$1$BuPbmLAz$1G7.evIChyqaEI0TlZp0F.:11071:0:99999:7:-1:-1:134540356

当密码被消除后,看起来是这样的:

root::11071:0:99999:7:-1:-1:134540356

 

现在,root用户就没有密码了,所以我就可以重新启动计算机,在login登录提示下,输入“root”,对于密码提示只需要按回车键就可了(没有密码)。登录成功后,可以立刻使用以下命令修改root密码:

 

passwd

有个例外,尽管在/etc/shadow删除了密码,对于Debian的发行版本并不允许你按“无密码”状态登录,在这种情况下,你需要做的是用其他用户(密码已经)的加密后的密码取代root的密码,然后使用该密码重新登录。

想给远程用户设置用户帐号,用电子邮件发送加密密码也是一个安全的办法,“我正在帮你在我的计算机上设置ftp帐号,请把你的加密密码用电子邮件发送给我”。等你收到加密密码后,把它插入到/etc/shadow文件里。这样,用户就可以登录了,因为只有她知道她的密码,其他人不知道。

为了让我的计算机没有“软盘访问”功能有点难度,我喜欢在没有软驱的情况下运行计算机。不幸的是,Linux光盘现在是可以自启动的。我在BIOS里设置启动设备的顺序以保证系统从硬盘启动而不是软驱或者光驱,然后给BIOS设置加上密码保护,这样就没有其他人能够修改BIOS设置。但是,我还是很担心BIOS的密码很容易被破解,或者有人打开计算机盖把BIOS的电池放电来重新设置BIOS。还可能有人把我的硬盘拿走然后在别的计算机上阅读J 。所以,我正在考虑在我的计算机上安装一个现在已经有效的Linux“加密文件系统”,但是以其考虑这么多麻烦问题,我觉得还是干脆把计算机锁在屋里才是一个真正的好办法。这些听起来头很大吧?事实大概也是这样的――这里我只是把一些计算机的安全问题稍微罗列了一下,即使在Linux下,如果黑客有潜在可能可以直接接触你的计算机硬件,Linux也是不安全的。

3.2.4  忘记了普通用户密码怎么办
 

如果是普通用户(非root用户)忘记密码,这个不是什么大问题,因为root可以修改任何人的密码。举个例子(要求root用户)

passwd barbara

按回车键后,将提示输入用户barbara的新密码(root用户不需要知道旧的密码)。如果一个普通用户想要修改自己的密码,该用户会被要求输入旧的密码(这是一个安全特性,以避免当你离开你的坐位有人试图修改你的密码)。

3.2.5  关闭或删除一个用户
 

用户帐号可以被临时关闭或者永久删除

 

临时关闭(锁定)一个用户帐号,并不需要修改该用户的密码。只需要在/etc/shadow文件里属于该用户的行的第二个字段(密码)前面加上星号“*”就可以了。星号“*”指的是该用户不允许登录。当你想要把该用户恢复正常,只需要把星号“*”去掉就可以了,用户就可以恢复正常。

 

以下是一个在/etc/shadow关闭用户peter的例子:

 

peter:*$1$narMEFm6$fhA1puOU422HiSL5aggLI/:11193:0:99999:7:-1:-1:134539228

我也可以使用以下命令来关闭用户帐号:

passwd peter –l

使用以下命令重新释放该用户:

passwd peter –u

对于永久性(不可恢复)的删除一个用户帐号,我一般这样做:

- 以root登录

- 把我的用户标识改成要删除的那个用户,检查是否有新的重要的电子邮件:

su doomed_user_login_name

mail

logout

- 删除用户和用户组:

 

userdel doomed_user_login_name

groupdel doomed_user_login_name

 

- 然后把该用户从所属的其他用户组里面删除:

usermod –G doomed_user_login_name doomed_user_login_name

- 强制删除该用户的主目录和主目录下的所有文件和子目录:
rm –fr /home/doomed_user_login_name

3.2.6  文件的所有权和访问权
 
Linux(还有其他Unix)是一个安全,多用户的操作系统,同时,这也产生了文件访问权限的复杂性。没有设置好文件的访问权限可能会导致一些莫名其妙的问题。充分了解文件的访问权限是管理任何多用户操作系统(Linux, Unix, Windows NT)的最重要环节。

我的建议是:学习Linux(或者其他Unix)的文件访问权限的内容,你从来不会为此感到后悔。

文件拥有者

每个文件(或者目录)从属于一个文件拥有者(一般是一个用户名)和一个用户组。文件拥有者一般来说就是生成(或者拷贝)这个文件的用户。用户组经常包含一个用户-文件拥有者。用户组通常有一个名字来标识该用户,但是也不是必须的。一个文件只能被文件拥有者删除,或者是文件所属的用户组里的其他用户,或者是root用户。对于其他用户,如果被赋于适当的权限,也有可能修改或者删除该文件。文件所属的用户和用户组可以通过命令ls –l(长文件名显示格式)来显示:

ls –l junk

屏幕输出如下:

-rwx------ 1 yogin inca 27 Apr 24 14:12 junk

该文件属于拥有者yogin和用户组inca

文件的从属可以通过命令chown(修改文件拥有者)和chgrp(修改用户组),一般来说需要root用户:

chown peter junk

chgrp peter junk

ls –l junk

执行以上三条命令后,命令ls –l输出如下:

-rwx------ 1 peter peter 27 Apr 25 20:27 junk

当你以root用户身份为其他用户删除或者拷贝文件时,修改文件的从属可能是经常要做的事情,在做完文件的整理工作后,把文件的拥有者改成对应的用户。

文件的权限

文件的拥有者可以把文件的访问属性设成三种不同的模式: 读(r),写(w)和运行(x)和三个不同的用户级别: 文件拥有者(u),所属的用户组(g),系统里的其他用户(o)。你可以检查当前的文件访问权限:

ls –l filename

如果文件对于三种不同的用户都提供三种文件访问模式,输出结果看起来应该是:

-rwxrwxrwx

跳过第一个字符“-”(第一个字符显示文件的类型, “-” 表示普通文件,“ d” 表示目录文件,“ l” 表示链接文件,“c”表示字符设备,“b”表示块设备,“p”表示命名管道比如FIFO文件(First In First Out, 先进先出),“ f”表示堆栈文件比如LIFO文件(Last In First Out,后进先出)。

第一个字符之后的第一个三位字符组表示对于文件拥有者对该文件的权限,第二个三位字符组表示文件用户组对该文件的权限,第三个三位字符组表示系统其他用户对该文件的权限。如果没有权限,一般显示“-”字符。

以下是一个显示一个属于root的文件用户权限:该文件的拥有者root拥有所有权限,但是用户组和其他用户只能阅读和执行。

drwxr-xr-x 2 root root 21504 Apr 24 19:27 dev

第一个字符d显示该文件是一个目录。

你可以使用chmod命令来修改属于你的文件的访问权限。举个例子,以下命令将把文件junk给所有用户增加“只读”权限。

Chmod a+r junk

在以上的命令,除了用“a”表示所有用户(all),我还可以用“u”表示用户(user),“g”表示用户组(group),“o”表示其他用户(other users)。除了加号“+”增加权限,我还可以使用减号“-”删除权限,等于号“=”设置权限。除了“r”表示只读权限(read),我还可以用“w”表示写权限(write),“x”表示执行权限(execute)。

第二个例子,以下命令将删除其他用户对junk文件的执行权限:

chmod o-x junk

除了字符,也可以使用数字来设置权限。想知道是然后工作的,看以下例子:

 

execute=1

write=2

read=4

对于指定的三种不同用户级别总结如下:

0 = 没有任何权限 (不能读,不能写,不能执行)     (常见)

1 = 只能执行                                    (看起来不太正常)

2 = 只能写                                      (看起来不太正常)

3 = 只能写和执行                                (看起来不太正常)

4 = 只读                                       (常见)

5 = 只读和执行                                  (常见)

6 = 读和写                                      (常见)

7 = 读,写和执行                                (常见)

要给三个不同的用户级别设置访问权限,只需要把三个数字粘在一起就可以了。举例:

chmod 770 junk

将给文件拥有者和所属用户组所有权限(读,写和执行),而对于其他用户没有任何权限。

chmod 666 junk

将给所有用户(文件拥有者,所属用户组,其他用户)读写权限,但是没有执行权限。请注意这个666权限设置里很经常用到,有人认为这是整个Linux(或者其他Unix里)的精髓所在。

chmod 411 junk

将给文件拥有者以只读权限,对于所属用户组和其他用户只有执行权限。这个看起来好像没什么实际用处,但是对于北美的Linux用户可能会感到很有趣,因为411电话号码是他们用来获得电话号码查号帮助的。如果对于权限设置,你还能想出什么好主意,别忘了给我来电子邮件哦 (可能是007?)!

文件访问权限的数字表示法叫做“八位组”因为是基于八进制的(我们的日常计数系统是基于十进制)。八进制有八个数值从0到7,最大数字是7。对应的,十进制有十个数字从0到9,最大数字是9。八进制表示法对于二进制的文件权限表示法的确非常方便,每一个标志都可以通过设置成0或者1来表示“允许”或者“不允许”,如以下的例子:

 

用户级别:                   文件拥有者     用户组         其他用户

权限设置例子                     rwx             rw-             r--

缺省权限                         ---             --x -           wx

权限的二进制表示法                111             110             100

权限的八进制表示法                7               6               4

目录权限

目录的访问权限和一般文件的访问权限是不同的。对于一般文件:


r      =允许读文件内容

w      =允许修改文件内容

x      =允许执行该文件

对于目录而言:

r      =允许列出该目录下的文件和子目录

w      =允许生成和删除该目录下的文件

x      =允许访问该目录

使用umask设置缺省文件属性

当一个文件生成时,系统给以文件缺省的文件权限。在我的系统里,缺省权限是:


-rw-r--r--

这意味着由该用户生成的文件能被该用户读和写,而用户组和其他用户只能读。还有,在我的Redhat系统里,用户不能读取其他用户的主目录,因为用户主目录的缺省权限是

drwx------

我可以使用以下命令检查我刚生成的文件的缺省权限:

 

umask -S

 

(可选项-S代表“符号”告诉umask按容易阅读的格式显示文件权限,而不是缺省的数字格式)

我可以修改新生成文件的缺省权限


umask u=rw,g=,o=


对于新生成的文件,以上命令将给文件拥有者以读和写的权限,而用户组和其他用户将没有任何访问权限。
在umask命令里使用数值来设置文件的缺省属性更加麻烦。因为数值显示的是从用户那里去除掉的权限(刚好和chmod相反),比如:
umask 000
对于新生成的文件,你将给所有人所有的权限。下一个例子给文件拥有者以读和写的权限,而其他用户没有任何权限:
umask 177
为了让设置对系统永久有效,在文件/etc/profile里修改对应的行。

 

posted on 2006-09-16 18:40 有猫相伴的日子 阅读(4934) 评论(1)  编辑  收藏 所属分类: linux/unix应用

评论:
# re: linux用户密码文件权限 2008-11-19 16:13 | 地方
发生发生是是十分十分十分上发生发生是是事实   回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
本站不再更新,欢迎光临 java开发技术网