Hui's profileHui'S BlogPhotosBlogListsMore Tools Help

Hui'S Blog

Hui

感谢访问!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.

最好的阻止SSH暴力破解的方法(DenyHosts)

我的服务器每天都会有无数的SSH失败尝试记录,有些无聊的人一直不停的扫描,这些人真够无聊的,没事吃饱了撑着,老找些软件在那里穷举扫描,所以大家第一要记的设置一个好的够复杂的密码。

怎么样防,如果要一条一条将这些IP阻止显然治标不治本,还好有DenyHosts软件来代替我们手搞定他。

DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件,当发现重复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP的功能。

DenyHosts官方网站为:http://denyhosts.sourceforge.net

以下是安装记录(以CentOS 5.1, DenyHosts 2.6 为例)

安装

#wget
http://nchc.dl.sourceforge.net/. ... ython2.4.noarch.rpm
#rpm -ivh DenyHosts-2.6-python2.4.noarch.rpm

给denyhosts做成系统本身的服务

# cd /etc/init.d

# ln -s /usr/share/denyhosts/daemon-control denyhosts

# chkconfig --add denyhosts

配置

默认是安装到/usr/share/denyhosts目录的。

# cd /usr/share/denyhosts/
# cp denyhosts.cfg-dist denyhosts.cfg
# vi denyhosts.cfg
根据自己需要进行相应的配置(解释见下文件的配置文件)

DenyHosts配置文件:

SECURE_LOG = /var/log/secure
#ssh 日志文件,它是根据这个文件来判断的。

HOSTS_DENY = /etc/hosts.deny
#控制用户登陆的文件

PURGE_DENY = 5m
#过多久后清除已经禁止的

BLOCK_SERVICE = sshd
#禁止的服务名

DENY_THRESHOLD_INVALID = 1

#允许无效用户失败的次数

DENY_THRESHOLD_VALID = 3
#允许普通用户登陆失败的次数

DENY_THRESHOLD_ROOT = 5
#允许root登陆失败的次数

HOSTNAME_LOOKUP=NO
#是否做域名反解

ADMIN_EMAIL = iakuf@163.com
#管理员邮件地址,它会给管理员发邮件

DAEMON_LOG = /var/log/denyhosts
#自己的日志文件

启动服务

让他和系统启动时一起启动

#/etc/ini.d/denyhosts start
#chkconfig denyhosts on

可以用一台电脑远程连接过来测试.如果可以看到/etc/hosts.deny内是否有禁止的IP,有的话说明已经安装成功了。

注.我发现时间deny以后,删除ip的时间不是很准.解决的方法是改变DAEMON_PURGE = 这个的时间.我发现系统删除时间是以他为准.

DAEMON_PURGE:预设清除:当DenyHosts在预设模式下执行,执行清除机械作用过期最久的HOSTS_DENY,这个会影响PURGE_DENY的间隔。

Linux必学的60个命令

Linux必学的60个命令:网络操作命令
Linux必学的网络操作命令 (1)
作者:曹元其 发文时间:2004.11.18
因 为Linux系统是在Internet上起源和发展的,它与生俱来拥有强大的网络功能和丰富的网络应用软件,尤其是TCP/IP网络协议的实现尤为成熟。 Linux的网络命令比较多,其中一些命令像ping、 ftp、telnet、route、netstat等在其它操作系统上也能看到,但也有一些Unix/Linux系统独有的命令,如ifconfig、 finger、mail等。Linux网络操作命令的一个特点是,命令参数选项和功能很多,一个命令往往还可以实现其它命令的功能。
ifconfig
1.作用
ifconfig用于查看和更改网络接口的地址和参数,包括IP地址、网络掩码、广播地址,使用权限是超级用户。
2.格式
ifconfig -interface [options] address
3.主要参数
-interface:指定的网络接口名,如eth0和eth1。
up:激活指定的网络接口卡。
down:关闭指定的网络接口。
broadcast address:设置接口的广播地址。
pointopoint:启用点对点方式。
address:设置指定接口设备的IP地址。
netmask address:设置接口的子网掩码。
4.应用说明
ifconfig是用来设置和配置网卡的命令行工具。为了手工配置网络,这是一个必须掌握的命令。使用该命令的好处是无须重新启动机器。要赋给eth0接口IP地址207.164.186.2,并且马上激活它,使用下面命令:
#fconfig eth0 210.34.6.89 netmask 255.255.255.128 broadcast 210.34.6.127
该 命令的作用是设置网卡eth0的IP地址、网络掩码和网络的本地广播地址。若运行不带任何参数的ifconfig命令,这个命令将显示机器所 有激活接口的信息。带有“-a”参数的命令则显示所有接口的信息,包括没有激活的接口。注意,用ifconfig命令配置的网络设备参数,机器重新启动以 后将会丢失。
如果要暂停某个网络接口的工作,可以使用down参数:
#ifconfig eth0 down
ip
1.作用
ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig、route等,使用权限为超级用户。几乎所有的Linux发行版本都支持该命令。
2.格式
ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]
3.主要参数
OPTIONS是修改ip行为或改变其输出的选项。所有的选项都是以-字符开头,分为长、短两种形式。目前,ip支持如表1所示选项。
OBJECT是要管理者获取信息的对象。目前ip认识的对象见表2所示。
表1 ip支持的选项
-V,-Version 打印ip的版本并退出。
-s,-stats,-statistics 输出更为详尽的信息。如果这个选项出现两次或多次,则输出的信息将更为详尽。
-f,-family 这个选项后面接协议种类,包括inet、inet6或link,强调使用的协议种类。如果没有足够的信息告诉ip使用的协议种类,ip就会使用默认值inet或any。link比较特殊,它表示不涉及任何网络协议。
-4 是-family inet的简写。
-6 是-family inet6的简写。
-0 是-family link的简写。
-o,-oneline 对每行记录都使用单行输出,回行用字符代替。如果需要使用wc、grep等工具处理ip的输出,则会用到这个选项。
-r,-resolve 查询域名解析系统,用获得的主机名代替主机IP地址
COMMAND 设置针对指定对象执行的操作,它和对象的类型有关。一般情况下,ip支持对象的增加(add)、删除(delete)和展示(show或list)。有些 对象不支持这些操作,或者有其它的一些命令。对于所有的对象,用户可以使用help命令获得帮助。这个命令会列出这个对象支持的命令和参数的语法。如果没 有指定对象的操作命令,ip会使用默认的命令。一般情况下,默认命令是list,如果对象不能列出,就会执行help命令。
ARGUMENTS 是命令的一些参数,它们倚赖于对象和命令。ip支持两种类型的参数:flag和parameter。flag由一个关键词组成;parameter由一个 关键词加一个数值组成。为了方便,每个命令都有一个可以忽略的默认参数。例如,参数dev是ip link命令的默认参数,因此ip link ls eth0等于ip link ls dev eth0。我们将在后面的详细介绍每个命令的使用,命令的默认参数将使用default标出。
4.应用实例
添加IP地址192.168.2.2/24到eth0网卡上:
#ip addr add 192.168.1.1/24 dev eth0
丢弃源地址属于192.168.2.0/24网络的所有数据报:
#ip rule add from 192.168.2.0/24 prio 32777 reject
ping
1.作用
ping检测主机网络接口状态,使用权限是所有用户。
2.格式
ping [-dfnqrRv][-c][-i][-I][-l][-p][-s][-t] IP地址
3.主要参数
-d:使用Socket的SO_DEBUG功能。
-c:设置完成要求回应的次数。
-f:极限检测。
-i:指定收发信息的间隔秒数。
-I:网络界面使用指定的网络界面送出数据包。
-l:前置载入,设置在送出要求信息之前,先行发出的数据包。
-n:只输出数值。
-p:设置填满数据包的范本样式。
-q:不显示指令执行过程,开头和结尾的相关信息除外。
-r:忽略普通的Routing Table,直接将数据包送到远端主机上。
-R:记录路由过程。
-s:设置数据包的大小。
-t:设置存活数值TTL的大小。
-v:详细显示指令的执行过程。
ping 命令是使用最多的网络指令,通常我们使用它检测网络是否连通,它使用ICMP协议。但是有时会有这样的情况,我们可以浏览器查看一个网页,但是却无法 ping通,这是因为一些网站处于安全考虑安装了防火墙。另外,也可以在自己计算机上试一试,通过下面的方法使系统对ping没有反应:
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
netstat
1.作用
检查整个Linux网络状态。
2.格式
netstat [-acCeFghilMnNoprstuvVwx][-A][--ip]
3.主要参数
-a--all:显示所有连线中的Socket。
-A:列出该网络类型连线中的IP相关地址和网络类型。
-c--continuous:持续列出网络状态。
-C--cache:显示路由器配置的快取信息。
-e--extend:显示网络其它相关信息。
-F--fib:显示FIB。
-g--groups:显示多重广播功能群组组员名单。
-h--help:在线帮助。
-i--interfaces:显示网络界面信息表单。
-l--listening:显示监控中的服务器的Socket。
-M--masquerade:显示伪装的网络连线。
-n--numeric:直接使用IP地址,而不通过域名服务器。
-N--netlink--symbolic:显示网络硬件外围设备的符号连接名称。
-o--timers:显示计时器。
-p--programs:显示正在使用Socket的程序识别码和程序名称。
-r--route:显示Routing Table。
-s--statistice:显示网络工作信息统计表。
-t--tcp:显示TCP传输协议的连线状况。
-u--udp:显示UDP传输协议的连线状况。
-v--verbose:显示指令执行过程。
-V--version:显示版本信息。
-w--raw:显示RAW传输协议的连线状况。
-x--unix:和指定“-A unix”参数相同。
--ip--inet:和指定“-A inet”参数相同。
4.应用实例
netstat 主要用于Linux察看自身的网络状况,如开启的端口、在为哪些用户服务,以及服务的状态等。此外,它还显示系统路由表、网络接口状态等。可以说,它是一 个综合性的网络状态的察看工具。在默认情况下,netstat只显示已建立连接的端口。如果要显示处于监听状态的所有端口,使用-a参数即可:
#netstat -a
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:32768 *:* LISTEN
tcp 0 0 *:32769 *:* LISTEN
tcp 0 0 *:nfs *:* LISTEN
tcp 0 0 *:32770 *:* LISTEN
tcp 0 0 *:868 *:* LISTEN
tcp 0 0 *:617 *:* LISTEN
tcp 0 0 *:mysql *:* LISTEN
tcp 0 0 *:netbios-ssn *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:10000 *:* LISTEN
tcp 0 0 *:http *:* LISTEN
......
上面显示出,这台主机同时提供HTTP、FTP、NFS、MySQL等服务。
telnet
1.作用
telnet表示开启终端机阶段作业,并登入远端主机。telnet是一个Linux命令,同时也是一个协议(远程登陆协议)。
2.格式
telnet [-8acdEfFKLrx][-b][-e][-k][-l][-n][-S][-X][主机名称IP地址<通信端口>]
3.主要参数
-8:允许使用8位字符资料,包括输入与输出。
-a:尝试自动登入远端系统。
-b:使用别名指定远端主机名称。
-c:不读取用户专属目录里的.telnetrc文件。
-d:启动排错模式。
-e:设置脱离字符。
-E:滤除脱离字符。
-f:此参数的效果和指定“-F”参数相同。
-F:使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机。
-k:使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名。
-K:不自动登入远端主机。
-l:指定要登入远端主机的用户名称。
-L:允许输出8位字符资料。
-n:指定文件记录相关信息。
-r:使用类似rlogin指令的用户界面。
-S:服务类型,设置telnet连线所需的IP TOS信息。
-x:假设主机有支持数据加密的功能,就使用它。
-X:关闭指定的认证形态。
4.应用说明
用 户使用telnet命令可以进行远程登录,并在远程计算机之间进行通信。用户通过网络在远程计算机上登录,就像登录到本 地机上执行命令一样。为了通过 telnet登录到远程计算机上,必须知道远程机上的合法用户名和口令。虽然有些系统确实为远程用户提供登录功能,但出于对安全的考虑,要限制来宾的操作 权限,因此,这种情况下能使用的功能是很少的。
telnet只为普通终端提供终端仿真,而不支持X-Window等图形环境。当 允许远程用户登录时,系统通常把这些用户放在一个受限制的 Shell中,以防系统被怀有恶意的或不小心的用户破坏。用户还可以使用telnet从远程站点登录到自己的计算机上,检查电子邮件、编辑文件和运行程 序,就像在本地登录一样。
ftp
1.作用
ftp命令进行远程文件传输。FTP是ARPANet的标准文件传输协议,该网络就是现今Internet的前身,所以ftp既是协议又是一个命令。
2.格式
ftp [-dignv][主机名称IP地址]
3.主要参数
-d:详细显示指令执行过程,便于排错分析程序执行的情形。
-i:关闭互动模式,不询问任何问题。
-g:关闭本地主机文件名称支持特殊字符的扩充特性。
-n:不使用自动登陆。
-v:显示指令执行过程。
4.应用说明
ftp 命令是标准的文件传输协议的用户接口,是在TCP/IP网络计算机之间传输文件简单有效的方法,它允许用户传输ASCⅡ文件和二进制文件。为了使用ftp 来传输文件,用户必须知道远程计算机上的合法用户名和口令。这个用户名/口令的组合用来确认ftp会话,并用来确定用户对要传输的文件进行什么样的访问。 另外,用户需要知道对其进行ftp会话的计算机名字的IP地址。
用户可以通过使用ftp客户程序,连接到另一台计算机上;可以在目录中上下移动、列出目录内容;可以把文件从远程计算机机拷贝到本地机上;还可以把文件从本地机传输到远程系统中。ftp内部命令有72个,下面列出主要几个内部命令:
ls:列出远程机的当前目录。
cd:在远程机上改变工作目录。
lcd:在本地机上改变工作目录。
close:终止当前的ftp会话。
hash:每次传输完数据缓冲区中的数据后就显示一个#号。
get(mget):从远程机传送指定文件到本地机。
put(mput):从本地机传送指定文件到远程机。
quit:断开与远程机的连接,并退出ftp。
route
1.作用
route表示手工产生、修改和查看路由表。
2.格式
#route [-add][-net|-host] targetaddress [-netmask Nm][dev]If]
#route [-delete][-net|-host] targetaddress [gw Gw] [-netmask Nm] [dev]If]
3.主要参数
-add:增加路由。
-delete:删除路由。
-net:路由到达的是一个网络,而不是一台主机。
-host:路由到达的是一台主机。
-netmask Nm:指定路由的子网掩码。
gw:指定路由的网关。
[dev]If:强迫路由链指定接口。
4.应用实例
route命令是用来查看和设置Linux系统的路由信息,以实现与其它网络的通信。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。
在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为Linux机器的默认路由。使用下面命令可以增加一个默认路由:
route add 0.0.0.0 192.168.1.1
rlogin
1.作用
rlogin用来进行远程注册。
2.格式
rlogin [ -8EKLdx ] [ -e char ] [-k realm ] [ - l username ] host
3.主要参数
-8:此选项始终允许8位输入数据通道。该选项允许发送格式化的ANSI字符和其它的特殊代码。如果不用这个选项,除非远端的不是终止和启动字符,否则就去掉奇偶校验位。
-E:停止把任何字符当作转义字符。当和-8选项一起使用时,它提供一个完全的透明连接。
-K:关闭所有的Kerberos确认。只有与使用Kerberos 确认协议的主机连接时才使用这个选项。
-L:允许rlogin会话在litout模式中运行。要了解更多信息,请查阅tty联机帮助。
-d:打开与远程主机进行通信的TCP sockets的socket调试。要了解更多信息,请查阅setsockopt的联机帮助。
-e:为rlogin会话设置转义字符,默认的转义字符是“~”。
-k:请求rlogin获得在指定区域内远程主机的Kerberos许可,而不是获得由krb_realmofhost(3)确定的远程主机区域内的远程主机的Kerberos许可。
-x:为所有通过rlogin会话传送的数据打开DES加密。这会影响响应时间和CPU利用率,但是可以提高安全性。
4.使用说明
如果在网络中的不同系统上都有账号,或者可以访问别人在另一个系统上的账号,那么要访问别的系统中的账号,首先就要注册到系统中,接着通过网络远程注册到账号所在的系统中。rlogin可以远程注册到别的系统中,它的参数应是一个系统名。
rcp
1.作用
rcp代表远程文件拷贝,用于计算机之间文件拷贝,使用权限是所有用户。
2.格式
rcp [-px] [-k realm] file1 file2 rcp [-px] [-r] [-k realm] file
3.主要参数
-r:递归地把源目录中的所有内容拷贝到目的目录中。要使用这个选项,目的必须是一个目录。
-p:试图保留源文件的修改时间和模式,忽略umask。
-k:请求rcp获得在指定区域内的远程主机的Kerberos许可,而不是获得由krb_relmofhost(3)确定的远程主机区域内的远程主机的Kerberos许可。
-x:为传送的所有数据打开DES加密。
finger
1.作用
finger用来查询一台主机上的登录账号的信息,通常会显示用户名、主目录、停滞时间、登录时间、登录Shell等信息,使用权限为所有用户。
2.格式
finger [选项] [使用者] [用户@主机]
3.主要参数
-s:显示用户注册名、实际姓名、终端名称、写状态、停滞时间、登录时间等信息。
-l:除了用-s选项显示的信息外,还显示用户主目录、登录Shell、邮件状态等信息,以及用户主目录下的.plan、.project和.forward文件的内容。
-p:除了不显示.plan文件和.project文件以外,与-l选项相同。
4.应用实例
在计算机上使用finger:
[root@localhost root]# Finger
Login Name Tty Idle Login Time Office Office Phone
root root tty1 2 Dec 15 11
root root pts/0 1 Dec 15 11
root root *pts/1 Dec 15 11
5.应用说明
如果要查询远程机上的用户信息,需要在用户名后面接“@主机名”,采用[用户名@主机名]的格式,不过要查询的网络主机需要运行finger守护进程的支持。
mail
1.作用
mail作用是发送电子邮件,使用权限是所有用户。此外,mail还是一个电子邮件程序。
2.格式
mail [-s subject] [-c address] [-b address]
mail -f [mailbox]mail [-u user]
3.主要参数
-b address:表示输出信息的匿名收信人地址清单。
-c address:表示输出信息的抄送()收信人地址清单。
-f [mailbox]:从收件箱者指定邮箱读取邮件。
-s subject:指定输出信息的主体行。
[-u user]:端口指定优化的收件箱读取邮件。
nslookup
1.作用
nslookup命令的功能是查询一台机器的IP地址和其对应的域名。使用权限所有用户。它通常需要一台域名服务器来提供域名服务。如果用户已经设置好域名服务器,就可以用这个命令查看不同主机的IP地址对应的域名。
2.格式
nslookup [IP地址/域名]
3.应用实例
(1)在本地计算机上使用nslookup命令
$ nslookup
Default Server: name.cao.com.cn
Address: 192.168.1.9
>
在符号“>”后面输入要查询的IP地址域名,并回车即可。如果要退出该命令,输入“exit”,并回车即可。
(2)使用nslookup命令测试named
输入下面命令:
nslookup
然后就进入交换式nslookup环境。如果named正常启动,则nslookup会显示当前DNS服务器的地址和域名,否则表示named没能正常启动。
下面简单介绍一些基本的DNS诊断。
◆ 检查正向DNS解析,在nslookup提示符下输入带域名的主机名,如hp712.my.com,nslookup应能显示该主机名对应的IP地址。如 果只输入hp712,nslookup会根据/etc/resolv.conf的定义,自动添加my.com域名,并回答对应的IP地址。
◆检查反向DNS解析,在nslookup提示符下输入某个IP地址,如192.22.33.20,nslookup应能回答该IP地址所对应的主机名。
◆检查MX邮件地址记录在nslookup提示符下输入:
set q=mx
然后输入某个域名,输入my.com和mail.my.com,nslookup应能够回答对应的邮件服务器地址,即support.my.com和support2.my.com。
动手练习
1.危险的网络命令
互 联网的发展使安全成为一个不能忽视的问题,finger、ftp、rcp和telnet在本质上都是不安全的,因 为它们在网络上用明文传送口令和数据,嗅探器可以非常容易地截获这些口令和数据。而且,这些服务程序的安全验证方式也是有弱点的,很容易受到“中间服务器 ”方式的攻击。这里笔者把一些不安全的命令根据危险等级列出,见表3所示。
现在ftp、telnet可以被SSH命令代替绑定在 端口22上,其连接采用协商方式,使用RSA加密。身份鉴别完成之后,后面的所有流量都使 用IDEA 进行加密。SSH(Secure Shell)程序可以通过网络登录到远程主机,并执行命令。rcp、rlogin等远程调用命令也逐渐被VNC软件代 替。
2.在一张网卡上绑定多个IP地址
在Linux下,可以使用ifconfig方便地绑定多个IP地址到一张网卡。例如,eth0接口的原有IP地址为192.168.0 .254,可以执行下面命令:
ifconfig eth0:0 192.168.0.253 netmask 255.255.255.0
ifconfig eth0:1 192.168.0.252 netmask 255.255.255.0
......
3.修改网卡MAC地址
首先必须关闭网卡设备,命令如下:
/sbin/ifconfig eth0 down
修改MAC地址,命令如下:
/sbin/ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE
重新启用网卡:
/sbin/ifconfig eht0 up
这样网卡的MAC地址就更改完成了。每张网卡的MAC地址是惟一,但不是不能修改的,只要保证在网络中的MAC地址的惟一性就可以了。
4.初步部署IPv6
IPv4 技术在网络发展中起到了巨大的作用,不过随着时间的流逝它无论在网络地址的提供、服务质量、安全性等方面都越来越力不从心,IPv6呼之欲出。Linux 是所有操作系统中最先支持IPv6的,一般Linux基于2.4内核的Linux发行版本都可以直接使用IPv6,不过主要发行版本没有加载IPv6模 块,可以使用命令手工加载,需要超级用户的权限。
(1)加载IPv6模块
使用命令检测,其中inet6 addr: fe80::5054:abff:fe34:5b09/64,就是eth0网卡的IPv6地址。
# modprobe IPv6
#ifconfig
eth0 Link encap:Ethernet HWaddr 52:54:AB:34:5B:09
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::5054:abff:fe34:5b09/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 b) TX bytes:1360 (1.3 Kb)
Interrupt:5 Base address:0xec00
(2)使用ping命令检测网卡的IPv6地址是否有效
#ping6 -I eth0 -c 2 fe80::200:e8ff:fea0:2586
和IPv4不一样,使用ping6命令时必须指定一个网卡界面,否则系统不知道将数据包发送到哪个网络设备。I表示Interface、eth0是第一个网卡,-c表示回路,2表示ping6操作两次。结果见图1所示。
图1 IPv6网络下的ping6命令
(3)使用ip命令在IPv6下为eth0增加一个IP地址
#ip -6 addr add 3ffe:ffff:0:f101::1/64 dev eth0
使用ifconfig命令,查看网卡是否出现第二个IPv6地址。
Linux网络的主要优点是能够实现资源和信息的共享,并且用户可以远程访问信息。Linux提供了一组强有力的网络命令来为用户服务,这些工具能够帮助用户进行网络设定、检查网络状况、登录到远程计算机上、传输文件和执行远程命令等。
上面介绍了Linux中比较重要的网络命令,其实Linux还有许多命令需要学习。Linux网络操作命令的一个特点就是命令参数选项很多,并不要求全部记住,关键在于理解命令的主要用途和学会使用帮助信息。

原文地址 http://zhanjun.net/?q=node/30

linux基本命令手册

NO 分类 PS1 命令名 用法及参数 功能注解 对应章节
1 文件管理 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件
文件管理 # ls ls -l或ll 列出当前目录下文件的详细信息
文件管理 # pwd pwd 查看当前所在目录的绝对路经
文件管理 # cd cd .. 回当前目录的上一级目录
文件管理 # cd cd - 回上一次所在的目录
文件管理 # cd cd ~ 或 cd 回当前用户的宿主目录
文件管理 # cd cd ~用户名 回指定用户的宿主目录
2 文件管理 # mkdir mkdir 目录名 创建一个目录
文件管理 # mkdir mkdir –p 递归式去创建一些嵌套目录
文件管理 # rmdir Rmdir 空目录名 删除一个空目录
3 文件管理 # rm rm 文件名 文件名 删除一个文件或多个文件
文件管理 # rm rm -rf 非空目录名 递归删除一个非空目录下的一切,不让提式-f
4 文件管理 # cat cat文件名 一屏查看文件内容
5 文件管理 # more more文件名 分页查看文件内容
6 文件管理 # less less 文件名 可控分页查看文件内容
7 文件管理 # grep grep字符 文件名 根据字符匹配来查看文件部分内容
8 文件管理 # mv mv 路经/文件 /经/文件 移动相对路经下的文件到绝对路经下
文件管理 # mv mv 文件名 新名称 在当前目录下改名
9 文件管理 # cp cp /路经/文件 ./ 移动绝对路经下的文件到当前目录下
10 文件管理 # find find 路经 -name “字符串” 查找路经所在范围内满足字符串匹配的文件和目录
11 文件管理 # ln ln 源文件 链接名 创建当前目录源文件的硬链接
ln /home/test /usr/test1 在/usr下建立/home/test的硬链接
12 文件管理 # ln Ln -s a b 创建当前目录下a的符号链接b
13 文件管理 # touch touch file1 file2 创建两个空文件
14 磁盘管理 # df df 用于报告文件系统的总容量,使用量,剩余容量。
15 磁盘管理 # du du -b /home 查看目前/HOME目录的容量(k)及子目录的容量(k)。
16 磁盘管理 # fdisk fdisk -l 查看系统分区信息
17 磁盘管理 # fdisk fdisk /dev/sdb 为一块新的SCSI硬盘进行分区
18 磁盘管理 # mkfs.ext3 Mkfs.ext3 /dev/sdb1
为第一块SCSI硬盘的第一主分区格式化成
ext3的文件系统
mkfs.ext2 Mkfs.ext2/dev/sdb2 格式化成ext2文件系统
19 磁盘管理 # mount mount -t 文件系统类型 设备路经 访问路经
磁盘管理 # 文件系统类型
Iso9660 光驱文件系统
vfat Fat文件系统(windows)
挂载光驱 # mount –t iso9660 /dev/cdrom /mnt/cdrom
挂载FAT # mount –t vfat /dev/hda5 /mnt/cdrom 挂第一个ide的第五个逻辑分区
17 磁盘管理 # Umount /mnt/cdrom 卸载/mnt/cdrom为空
18 文件权限 # chmod chmod u+s file 为file的属主加上特殊权限
chmod g+r file 为file的属组加上读权限
chmod o+w file 为file的其它用户加上写权限
chmod a-x file 为file的所有用户减去执行权限
chmod 765 file 为file的属主设为完全权限,属组设成读写权,其它用户具有读和执心权限
19 文件权限 # chown chown root /home 把/home的属主改成root用户
20 文件权限 # chgrp chgrp root /home 把/home的属组改成root组
21 打印管理 # redhat-config-printer-tui 进入安装打印机界面
22 打印管理 # lp lp –d hptr file 打印file到hptr的打印机上
23 打印管理 # lpq Lpq –P 打印机名 查看打印机的状态
24 打印管理 # lprm Lprm –P 打印机名 a 删除打印机内的打印作业
25 打印管理 # disable Disable –r “changing paper” HPtr 禁用打印机并提示原因
26 打印管理 # enable Enable HPtr 重新启用被禁用的
27 用户管理 # useradd Useradd 创建一个新的用户
28 用户管理 # groupadd Groupadd 组名 创建一个新的组
29 用户管理 # passwd Passwd 用户名 为用户创建密码
30 用户管理 # Passwd -d Passwd -d用户名 删除用户密码也能登陆
31 用户管理 # Passwd -l Passwd -l用户名 锁定账号密码
32 用户管理 # Passwd -u Passwd -u用户名 解锁账号密码
33 用户管理 # Passwd -S Passwd -S用户名 查询账号密码
34 用户管理 # Usermod -l Usermod -l 新用户名 老用户名 为用户改名
35 用户管理 # Usermod -L Usermod -L 要锁定用户名 锁定用户登陆
36 用户管理 # Usermod -U Usermod –U解锁用户名 解锁用户登陆
37 用户管理 # Usermod -u Usermod –u 501用户名 改变用户UID
38 用户管理 # Userdel Userdel–r 用户名 删除用户一切
39 用户管理 # Groupmod -n Groupmod –n新用户名 老用户名 为组改名
40 用户管理 # Groupmod -g Groupmod –g 501 组名 改变组GID
41 用户管理 # groupdel Groupdel组名 先应删它的用户 删除组
42 用户管理 # gpasswd -a gpasswd -a 用户名 组名 增加用户到组
43 用户管理 # Id id 用户名 查用户信息
44 软件管理 # rpm -qa rpm –qa | less 查询已安装RPM
45 软件管理 # rpm –qa | grep ftp 查询指定RPM
46 软件管理 # rpm -q rpm -q 已安装的RPM包 查是否安装
47 软件管理 # rpm -q telnet-server 查看telnet服务器包
48 软件管理 # rpm -qi rpm –qi 软件包名称 查看软件的描述信息
49 软件管理 # rpm -ql rpm –ql软件包名称 查询软件包的文件列表
50 软件管理 # rpm -qf rpm –qf软件包名称 查询某个文件所属的软件包
51 软件管理 # rpm -qp rpm –qp软件包全名 查询未安装的软件包信息
52 软件管理 # rpm -e rpm –e 软件包名称 删除具体的软件包
53 软件管理 # rpm -U rpm –Uvh软件包全名 升级软件包并显示过程
54 软件管理 # rpm -ivh rpm –ivh 软件包全名 安装软件包并显示过程
55 软件管理 # rpm -V rpm –V软件包名称 验证软件包的大小,类型等
56 软件管理 # tar -c 创建包 –x 释放包 -v 显示命令过程 –z 代表压缩包
57 软件管理 # tar -cf tar –cvf benet.tar /home/benet 把/home/benet目录打包
58 软件管理 # tar -czf tar –zcvf benet.tar.gz /mnt 把目录打包并压缩
59 软件管理 # tar –tf tar –tf benet.tar 看非压缩包的文件列表
60 软件管理 # tar –tzf tar –tf benet.tar.gz 看压缩包的文件列表
61 软件管理 # tar –xf tar –xf benet.tar 非压缩包的文件恢复
62 软件管理 # tar –zxvf tar –zxvf benet.tar.gz 压缩包的文件解压恢复
63 软件管理 # tar -jxvf tar –jxvf benet.tar.bz2
64 软件管理 # diff diff file1 file2 > 补丁名.patch 为新旧文件生成补丁文件
65 软件管理 # diff diff file1 file2 比较两个文件的区别
66 软件管理 # Patch Patch file补丁名.patch 打补丁
67 软件管理 # ./configure –prefix=/usr/local/ 编译前配置
68 软件管理 # make 编译
69 软件管理 # make install 安装编译好的源码包
70 启动管理 # reboot Init 6 重启LINUX系统
71 启动管理 # Halt Init 0 Shutdown –h now 关闭LINUX系统
72 启动管理 # runlevel 显示系统运行级
73 启动管理 # Init [0123456] 改变系统运行级,7种
74 启动管理 # Chkconfig –-list [服务名称] 查看服务的状态
75 启动管理 # Chkconfig –-level <运行级> <服务名> on|off|set 设置服务的启动状态
76 启动管理 # Chkconfig <服务名> on|off|set 设置非独立服务启状态
77 进程管理 # Top动态 Ps-aux静态 进程树pstree 查看系统进程
78 进程管理 # 程序名 & 后台运行程序
79 进程管理 # fg 把后台运行的进程调回前台
80 进程管理 # bg 把前台运行进程调到后台
81 进程管理 # renice Renice +1 180 把180号进程的优先级加1
82 进程管理 # kill Kill PID 终止某个PID进程
83 进程管理 # at at 5pm + 3 days
/bin/ls 指定三天后下午5:00执行/bin/ls
84 进程管理 # crontab Crontab -e 用VI的形式来编辑自动周期性任务
85 进程管理 # crontab Crontab -l 查看自动周期性任务
86 进程管理 # crontab Crontab -r 删除自动周期性任务
87 进程管理 # crond Service crond实现磁盘配额 (注安装LINUX时建立/home分区)
目标:对用户zhao在/home目录上实现soft limit为5k,hard limit 为10k的磁盘配额
实现步骤:
1. 修改包含/home的行, #vi /etc/fstab, 改为:defaults,usrquota。也就是增加usrquota项。然后保存退出。
2、卸载/home目录 #umount /home
3. 挂接/home目录 #mount /home
4、增加用户zhao #useradd zhao
5、修改密码 #passwd zhao
6、生成关于/home目录的quota信息 # quotacheck -cmug /home
#quotacheck -vu /home
7、查看所有用户的信息 #repquota -au
8、设置配额 #edquota -u zhao
将soft 和hard 分别改为5和10
9、保存并退出 #wq!
10、修改时间 #edquota -t
11、 #wq!
12.开启/home上的磁盘配额功能 #quotaon /home
13.查询配额 #quota -u zhao
14.验证配额 #su - zhao
$touch myfile

用Linux命令查看硬件信息

一 查看流量:
iptraf

二 查看硬件信息的命令

dmesg

若网卡出现 lease broken 服务器网卡不稳定,请更换游戏服务器网卡插槽

三 测试内存:
memtest 1024K(内存)

四 查看cpu

pico /proc/cpuinfo

五 查看IRQ使用情况
/proc/interrupts

六 查看内存
free

---------------------------------------------------------------
内存: cat /proc/meminfo
cpu: cat /proc/cpuinfo
硬盘: df -h -T(no device的设备看不到)
fdisk -l 可以在redhat9.0中看; redhat企业版不行.
  

solaris:
网卡速度: dmesg |grep link
CPU频率: psrinfo -v                    或者mpstat
cpu\内存等:prtdiag -v (大部分信息全部列出) 需要先进入/usr/platform/sun4u/sbin
硬盘: iostat -E

linux下还有几个命令可以看很多硬件设备的信息.
lspci -v
dmidecode
dmesg

深入Linux PAM 体系结构

一、什么是Linux-PAM
为安全起见,计算机系统只有经过授权的合法用户才能访问,在这里如何正确鉴别用户的真实身份是一个关键的问题。所谓用户鉴别,就是用户向系统以一种安全的 方式提交自己的身份证明,然后由系统确认用户的身份是否属实的过程。换句话说,用户鉴别是系统的门户,每个用户进入到系统中都必须经过鉴别这一道关。
最初,Linux系统的用户鉴别过程就像各种Unix系统的一样:系统管理员为用户建立一个帐号并为其指定一个口令,用户用此指定的口令登录后重新设置自 己的口令,这样用户就具有了一个只有他自己知道的秘密口令。一般情况下,用户的口令经过加密处理后存放于 /etc/passwd 文件中。用户登录时,登录服务程序提示用户输入其用户名和口令,然后将口令加密并与 /etc/passwd 文件中对应帐号的加密口令进行比较,如果口令相匹配,说明用户的身份属实并允许此用户访问系统。这种思想基于只有用户自己知道他的口令,所以输入的口令是 正确的话,那么系统就认定他是所声称的那个人。
后来,还采用了许多其他的鉴别用户的方法,如用于网络环境的 Kerberos 以及基于智能卡的鉴别系统等。但是这些鉴别方案有一个通病:实现鉴别功能的代码通常作为应用程序的一部分而一起编译,这样问题就来了------如果发现 所用算法存在某些缺陷或想采用另一种鉴别方法时,用户不得不重写(修改或替换)然后重新编译原程序。很明显,我们原先的鉴别方案缺乏灵活性,这里的牵一发 而动全身的情形很是让人恼火。
鉴于以上原因,人们开始寻找一种更佳的替代方案:一方面,将鉴别功能从应用中独立出来,单独进行模块化设计,实现和维护;另一方面,为这些鉴别模块建立标 准 API,以便各应用程序能方便的使用它们提供的各种功能;同时,鉴别机制对其上层用户(包括应用程序和最终用户)是透明的。直到 1995 年,SUN 的研究人员提出了一种满足以上需求的方案--插件式鉴别模块(PAM)机制并首次在其操作系统 Solaris 2.3 上部分实现。插件式鉴别模块(PAM)机制采用模块化设计和插件功能,使得我们可以轻易地在应用程序中插入新的鉴别模块或替换原先的组件,而不必对应用程 序做任何修改,从而使软件的定制、维持和升级更加轻松--因为鉴别机制与应用程序之间相对独立。应用程序可以通过 PAM API 方便的使用 PAM 提供的各种鉴别功能,而不必了解太多的底层细节。此外,PAM的易用性也较强,主要表现在它对上层屏蔽了鉴别的具体细节,所以用户不必被迫学习各种各样的 鉴别方式,也不必记住多个口令;又由于它实现了多鉴别机制的集成问题,所以单个程序可以轻易集成多种鉴别机制如 Kerberos 鉴别机制和 Diffie - Hellman 鉴别机制等,但用户仍可以用同一个口令登录而感觉不到采取了各种不同鉴别方法。
在广大开发人员的努力下,各版本的 UNIX 系统陆续提供对 PAM 的支持。其中,Linux-PAM 是专门为 Linux 机器实现的,包括 Caldera 1.3、2.2、Debian 2.2、Turbo Linux 3.6、Red Hat 5.0 以及 SuSE 6.2 及它们的后续版本都提供对 PAM 的支持。FreeBSD 从 3.1 版开始支持 PAM。需要注意的是,除了具体实现不同外,各种版本 Unix 系统上的 PAM 的框架是相同的,所以我们在这里介绍的 Linux-PAM 框架知识具有普遍性。因此在下文介绍其框架的过程中可以看到,我们并没有刻意区分 PAM 与 Linux-PAM 这两个术语。

二、PAM 的分层体系结构
PAM 为了实现其插件功能和易用性,它采取了分层设计思想:让各鉴别模块从应用程序中独立出来,然后通过PAM API作为两者联系的纽带,这样应用程序就可以根据需要灵活地在其中"插入"所需鉴别功能模块,从而真正实现了"鉴别功能,随需应变"。实际上,这一思路 非常符合软件设计中的"高内聚,低耦合"这一重要思想,PAM 的体系如下简图所示:

图1 PAM体系结构
从上图可以看出,PAM API 起着承上启下的作用,它是应用程序和鉴别模块之间联系的纽带:当应用程序调用 PAM API 时,应用接口层按照配置文 件 pam.conf 的规定,加载相应的鉴别模块。然后把请求(即从应用程序那里得到的参数)传递给底层的鉴别模块,这时鉴别模块就可以根据要求执行具体的鉴别操作了。当鉴别 模块执行完相应操作后,将结果返回给应用接口层,然后由接口层根据配置的具体情况将来自鉴别模块的应答返回给应用程序。
上面描述了 PAM 的各个组成部分,以及它们作为整体的运作机理。下面将对 PAM 的关键的低二层分别加以介绍。

三、第一层:模块层
模块层处于整个结构的最底层,它向上为接口层提供用户鉴别等服务,也就是说所有具体的鉴别工作都是由该层的模块来完成的。对于应用程序,有些不但需要验证 用户的口令,还可能要求验证用户的帐户是否已经过期。此外,有些应用程序也许还会要求记录当前会话的有关信息或改变口令等,所以 PAM 在模块层除了提供鉴别模块外,同时提供了支持帐户管理、会话管理以及口令管理功能的模块。当然,这四种模块并不是所有应用程序所必需的,而是根据需要灵活 取舍,比如虽然 login 可能要求访问所有四种模块,但是 su 可能仅仅需要使用鉴别组件即可。至于如何取舍则涉及到接口层的 PAM API和配置文件,这部分内容将在下文中加以介绍。

四、第二层:应用接口层
应用接口层位于 PAM 结构的中间部分,它向上为应用程序屏蔽了用户鉴别等过程的具体细节,向下调用模块层中的具体模块所提供的特定服务。由图1可以看出,它主要由 PAM API 和配置文件两部分组成,下面将逐一介绍。
PAM API 可以分为两类,一类是用于调用下层特定模块的接口,这类接口与底层的模块相对应:
  • 鉴别类接口:pam_authenticate()用于鉴别用户,pam_setcred()用于修改用户的秘密信息。
  • 帐号类接口:pam_acct_mgmt()检查受鉴别的用户所持帐户是否有权登陆系统,以及该帐户是否已过期等。
  • 会话类接口:包括用于会话管理和记帐的 pam_open_session()和 pam_close_session()函数。
  • 口令类接口:包括用于修改用户口令的 pam_chauthtok()。
第二类接口通常并不与底层模块一一对应,它们的作用是对底层模块提供支持以及实现应用程序与模块之间的通信等。具体如下:
  • 管理性接口
    每组 PAM 事务从 pam_start()开始,结束于 pam_end()函数。接口 pam_get_item()和 pam_set_item()用来读写与 PAM 事务有关的状态信息。同时,能够用 pam_str()输出 PAM 接口的出错信息。
  • 应用程序与模块间的通讯接口
    在应用程序初始化期间,某些诸如用户名之类的数据可以通过 pam_start()将其存放在PAM接口层中,以备将来底层模块使用。另外,底层模块还可以使用 pam_putenv()向应用程序传递特定的环境变量,然后应用程序利用 pam_getenv() 和 pam_getenvlist() 读取这些变量。
  • 用户与模块间的通讯接口
    pam_start()函数可以通过会话式的回调函数,让底层模块通过它们读写模块相关的鉴别信息,比如以应用程序所规定的方式提示用户输入口令。
  • 模块间通讯接口
    尽管各模块是独立的,但是他们仍然能够通过 pam_get_item()和 pam_set_item()接口共享某些与鉴别会话有关的公用信息,诸如用户名、服务名、口令等。此外,这些API还可以用于在调用 pam_start()之后,让应用程序修改状态信息。
  • 读写模块状态信息的接口
    接口 pam_get_data()和 pam_set_data()用以按照PAM句柄要求访问和更新特定模块的信息。此外,还可以在这些模块后附加一个清除数据函数,以便当调用 pam_end()时清除现场。
由于 PAM 模块随需加载,所以各模块始化任务在第一次调用时完成。如果某些模块的清除任务必须在鉴别会话结束时完成,则它们应该使用 pam_set_data()规定清除函数,这些执行清除任务的函数将在应用程序调用 pam_end()接口时被调用。

五、配置文件
我们注意到,配置文件也放在了在应用接口层中,它与 PAM API 配合使用,从而达到了在应用中灵活插入所需鉴别模块的目的。它的作用主要是为应用选定具体的鉴别模块,模块间的组合以及规定模块的行为。下面是一个示例配置文件:

图2.示例配置文件
我们可以看到,配置文件有许多登记项(每行对应一个登记项)组成,每一行又分为五列(每列对应一栏),详细解释如下:
第一栏,service表示使用PAM的应用程序,比如login、passwd、rlogin等。这一栏中的OTHER表示所有没在该文件中显式列出的 应用。也就是说,如果所有程序具有相同的需求,整个配置文件只需要一行即可,并且该行的第一栏为OTHER。本例中,因为所有应用程序使用相同的会话模 块,所以实际上可以用单行,即
" OTHER auth        required     pam_unix_auth.so"

来代替文件中的这些行:
"login session     required     pam_unix_session.softp     session     required     pam_unix_session.sotelnet   session     required     pam_unix_session.so"。

第二栏,module_type指明程序所用PAM底层模块的类型:auth表示鉴别类模块;account表示帐户类模块;session表示会话类模 块;password表示口令类模块。注意,每行只能指定一种类型模块,如果程序需要多种模块的话,可在多行中分别规定。
第三栏,control_flag规定如何处理模块的成功和失败情况。单个应用程序可以调用多种底层模块,这通常称为"堆叠",对应于某程序的按照配置文 件中出现顺序执行的所有模块成为"堆",堆中的各模块的地位与出错时的处理由control_flag栏的取值决定,它的五种可能的取值分别为 required、Requisite、sufficient或_optional,现介绍如下:
required--它表示该模块的成功是用户通过鉴别的必要条件,换句话说,只有当对应于应用程序的所有带required标记的模块全部成功后,该程 序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误 消息返回调用它的程序。
Requisite--它与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别,不同之处在于其一旦失败就不再执行堆中后面的其它模块,并且鉴别过程到此结束。
optional--它表示即便该模块失败,用户仍能通过鉴别。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。
sufficient--它表示该模块取得成功是用户通过鉴别的充分条件,也就是说只要标记为sufficient的模块一旦成功,那么PAM便立即向应 用程序返回成功而不必尝试任何其他模块。当标记为sufficient的模块失败时,sufficient模块当做optional对待。
第四栏,module_path指出PAM模块的位置。
第五栏,options用于向特定模块传递相关的选项,然后由模块分析解释这些任选项。比如使用此栏打开模块调试,或向某模块传递诸如超时值之类的参数等。另外,它还用于支持下文所述的口令映射技术。
如果任一栏出现错误,或某模块没有找到,那么所在行被忽略并将其作为严重错误进行记录。
本例中,login程序使用UNIX口令模块进行鉴别,而ftp程序却使用S/Key模块进行鉴别。如我们想改变ftp程序的鉴别方法,比如也用UNIX口令模块进行鉴别,那么我们不必改动源程序,只需将配置文件中的
ftp     auth        required     pam_skey_auth.so debug

改为
ftp     auth        required     pam_unix_auth.so debug

这样,当用户使用ftp时,将用传统的UNIX口令鉴别方式来验证其身份。由此可见,在PAM体制下为应用程序改变鉴别机制是一件轻松的事情。另 外,PAM体制的堆叠功能还使得应用程序能够支持多种鉴别机制,如下例中的login程序在配置文件中先后出现了三项与鉴别有关的登记项:

图3.示例配置文件
当login程序执行时先用pam_unix.so模块即传统的UNIX口令方式鉴别用户,然后再调用pam_kerb.so模块即Kerberos对用 户进行鉴别,最后用pam_rsa.so模块即RSA方式鉴别用户。在按上述顺序鉴别用户的过程中,如果pam_unix.so模块鉴别失败,它将继续调 用下面的模块进行鉴别而非立刻向login程序返回错误消息;pam_kerb.so模块也按同样方式处理,直到顺序处理完最后一个pam_rsa.so 模块后,PAM才将前面出现的错误信息返回给login程序。对于该配置,即使pam_rsa.so模块顺利通过,只要pam_unix.so模块和 pam_kerb.so模块中有一个出现错误,用户就不能通过鉴别;相反,即使pam_rsa.so模块失败,只要pam_unix.so模块和 pam_kerb.so模块都通过了,用户也能通过鉴别。


六、口令映射
在同一个机器上使用多个鉴别机制,尤其是一个应用程序集成多种鉴别机制可能导致用户需要记忆多个口令,这会让用户觉得很不舒服。虽然可以让所有机制使用相 同的口令来获取易用性,但是这将削弱系统的安全性--如果其中任何一个机制的口令泄露了,则所有机制都会受到牵累。此外,不同的鉴别机制在口令长度、容许 的字符、更新间隔、有效期等方面可能具有他们特有的要求,这些要求也是为多鉴别机制使用同一个口令必须考虑的一个问题。
PAM为我们提供了这样一种解决方案,它不排除为所有鉴别机制共用一个口令,同时允许通过口令映射技术让每个机制使用不同的口令。该方案用用户的"主口 令"加密其他的"副口令",并且将这些经过加密的副口令存放在一个用户能访问的地方。主口令一旦经过验证,鉴别模块就能用它解密那些加密的副口令从而获得 相应口令,然后将所需口令传递给鉴别模块。这称为"口令映射"。如果口令映射出现错误,或如果映射不存在,那么各鉴别模块应该提示用户输入口令。为支持口 令映射,主口令应保存在PAM第二层并且在需要时由其提供给堆叠的各个鉴别模块。同时,口令要在pam_authenticate函数返回之前清除。为了 保障口令映射的安全,主口令必须足够强壮,可以考虑使其的长度更长、组成口令字符的类型多样化并使用混合类型的字符组成口令等有效措施。
口令如何加密及其存储完全取决于具体的实现:它能够将加密的副口令(也称作"映射口令")存储在可靠或不可靠的地方,诸如智能卡、本地文件或目录服务。当然,如果加密的口令保存在一个不可靠的允许公共访问的地方,会留下受到字典攻击的隐患。
为实现口令映射,所有鉴别模块应支持以下四个映射选项∶
  • use_first_pass∶它表示当该模块执行时不提示用户输入口令,而将该模块之前的提示用户输入的主口令作为它们的公共口令进行验证。如果用户没能通过主口令的鉴别,则该模块不提示用户输入口令。此选项一般说来在系统管理员想强制用同一个口令通过多模块时使用。
  • try_first_pass∶除了如果主口令不正确,将提示用户输入口令之外,它的用法与use_first_pass相同。
  • use_mapped_pass∶ 它表示使用口令映射技术得到此模块的有效口令。也就是说,该模块执行时不提示用户输入口令,而是用映射口令即用主口令解密得到的该模块的副口令作为本模块 的口令输入进行验证。如果在此之前用户没能通过主口令的鉴别,则该模块也不会提示输入口令。
  • try_mapped_pass∶除了如果主口令不正确,它将提示用户输入口令之外,该项与use_mapped_pass用法相同。
当口令更换后,PAM会保存所有新旧口令,并且使有关模块能够访问到它们。其他模块能够使用此信息更新加密的口令而不必强制用户再次输入口令。
现以下面的配置文件为例讲解口令映射:

图4. 示例配置文件
在这里login程序集成了三种鉴别方式:传统UNIX口令鉴别、Kerberos和RSA鉴别,但通常情况下用户仅输入一次口令便能通过鉴别了。当程序 调用pam_unix.so模块时,PAM提示用户输入他们的UNIX口令,然后由pam_kerb.so模块对用户输入的UNIX口令进行鉴别。继而调 用pam_kerb.so模块,由于该模块的选项为use_mapped_pass,它将利用口令映射机制进行认证,也就是说,如果UNIX口令鉴别通过 的话,就将其作为pam_kerb.so模块的主口令来解密其对应的映射口令从而进行Kerberos鉴别。如果pam_unix.so模块所需口令没能 通过验证,则无法进行口令映射,那么PAM将直接调用下一鉴别模块而不提示用户输入其Kerberos口令。最后一个模块的选项为 use_first_pass,所以pam_rsa.so模块将使用前边输入的主口令来鉴别用户,如果口令错误也不提示用户输入RSA口令。所以,只要第 一次输入的口令是正确的,并且映射口令存在,则一个口令便足以通过鉴别。

七、结束语
Linux-PAM是一种使用灵活功能强大的用户鉴别机制,本文对它的组成结构以及各部分之间的关系进行了相应的分析,希望对读者理解PAM的机制有所帮助。