PAM入门介绍 (也很不错)

原文地址:http://sinbad.zhoubin.com/read.html?board=UNIX&num=482

作者:netguy (netguy@nsfocus.com)
主页:http://www.nsfocus.com
日期:2000-10-07

PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些
动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理
员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于
向系 统中添加新的认证手段。
PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux、SunOS、HP-UX 9.0等。

一、PAM的结构

PAM的整个框架结构如下图所示:

系统管理员通过PAM配置文件来制定认证策略,即指定什么服务该采用什么样的认证方法;应
用程序开发者通过在服务程序中使用PAM API而实现对认证方法的调用;而PAM服务模块(se
rvice module)的开发者则利用PAM SPI(Service Module API)来编写认证模块(主 要是
引出一些函数pam_sm_xxxx( )供libpam调用),将不同的认证机制(比如传统的UNIX认证方
法、Kerberos等)加入到系统中;PAM核 心库(libpam)则读取配置文件,以此为根据将服
务程序和相应的认证方法联系起来。
二、PAM支持的四种管理界面:

1、认证管理(authentication management)
主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密
信息。
2、帐户管理(account management)
主要是检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的
限制等等。
3、密码管理(password management)
主要是用来修改用户的密码。
4、会话管理(session management)
主要是提供对会话的管理和记账(accounting)。

三、PAM的文件:

/usr/lib/libpam.so.* PAM核心库
/etc/pam.conf或者/etc/pam.d/ PAM配置文件
/usr/lib/security/pam_*.so 可动态加载的PAM service module
对于RedHat,其目录不是/usr/lib,而是/lib。

四、PAM的配置:

PAM的配置是通过单个配置文件/etc/pam.conf。RedHat还支持另外一种配置方式,即通过配
置目录/etc/pam.d/,且这种的优先级要高于单 个配置文件的方式。

1、使用配置文件/etc/pam.conf

该文件是由如下的行所组成的:
service-name module-type control-flag module-path arguments

service-name 服务的名字,比如telnet、login、ftp等,服务名字“OTHER”代表所有没有
在该文件中明确配置的其它服务。
module-type 模块类型有四种:auth、account、session、password,即对应PAM所支持的
四种管理方式。同一个服务可以调用多个 PAM模块进行认证,这些模块构成一个stack。
control-flag 用来告诉PAM库该如何处理与该服务相关的PAM模块的成功或失败情况。它有四
种可能的 值:required,requisite,sufficient,optional。
required 表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败
结果也不会立即通知用户,而是要等到同一stack 中的所有模块全部执行完毕再将失败结果
返回给应用程序。可以认为是一个必要条件。
requisite 与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回
失败,将不再执行同一stack内的任何模块,而是直 接将控制权返回给应用程序。是一个必
要条件。注:这种只有RedHat支持,Solaris不支持。
sufficient 表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack
内的其它模块,但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。
optional表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回
值一般被忽略。
对于control-flag,从Linux-PAM-0.63版本起,支持一种新的语法,具体可参看Linux
PAM文档。
module-path 用来指明本模块对应的程序文件的路径名,一般采用绝对路径,如果没有给出
绝对路径,默认该文件在目录/usr/lib/security下 面。
arguments 是用来传递给该模块的参数。一般来说每个模块的参数都不相同,可以由该模块
的开发者自己定义,但是也有以下几个共同 的参数:
debug 该模块应当用syslog( )将调试信息写入到系统日志文件中。
no_warn 表明该模块不应把警告信息发送给应用程序。
use_first_pass 表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里
得到的密码。
try_first_pass 表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该
密码验证不通过,再提示用户输入新的密码。
use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码。
expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用
,因为泄漏用户名会对安全造成一定程度的威 胁。

2、使用配置目录/etc/pam.d/(只适用于RedHat Linux)

该目录下的每个文件的名字对应服务名,例如ftp服务对应文件/etc/pam.d/ftp。如果名为x
xxx的服务所对应的配置文件/etc/pam.d/xxxx不存 在,则该服务将使用默认的配置文件/et
c/pam.d/other。每个文件由如下格式的文本行所构成:
module-type control-flag module-path arguments
每个字段的含义和/etc/pam.conf中的相同。

3、配置的例子

例一:用/etc/pam.conf配置默认的认证方式。

下面的例子将拒绝所有没有在/etc/pam.conf中明确配置的服务。OTHER代表没有明确配置的
其它所有服务,pam_deny模块的作用只是简 单地拒绝通过认证。
OTHER auth required /usr/lib/security/pam_deny.so
OTHER account required /usr/lib/security/pam_deny.so
OTHER password required /usr/lib/security/pam_deny.so
OTHER session required /usr/lib/security/pam_deny.so

例二:通过/etc/pam.d/rsh文件配置rsh服务的认证方式。

rsh服务认证用户时,先使用/etc/hosts.equiv和.rhosts文件的认证方式,然后再根据/etc
/nologin文件的存在与否来判断是否允许该用户使用 rsh,最后使用password database来认
证用户。

auth required /lib/security/pam_rhosts_auth.so
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
session required /lib/security/pam_pwdb.so

例三:通过/etc/pam.conf配置ftpd的认证方式。

下面是ftpd服务利用PAM模块进行用户认证的三个步骤。首先用pam_ftp模块检查当前用户是
否为匿名用户,如果是匿名用户,则 sufficient控制标志表明无需再进行后面的认证步骤,
直接通过认证;否则继续使用pam_unix_auth模块来进行标准的unix认证,即用/etc/ passw
d和/etc/shadow进行认证;通过了pam_unix_auth模块的认证之后,还要继续用pam_listfil
e模块来检查该用户是否出现在文件/etc/ ftpusers中,如果是则该用户被deny掉。
ftpd auth sufficient /usr/lib/security/pam_ftp.so
ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass
ftpd auth required /usr/lib/security/pam_listfile.so \
onerr=succeed item=user sense=deny file=/etc/ftpuser
s

五、密码映射(password-mapping)

密码映射允许用户在不同的认证机制下使用不同的密码,其中有一个主密码(primary pass
word),其它密码为次密码(secondary pas
swords,可能有多个)。主密码用来对次密码进
行加密。在主密码认证通过后,认证模块利用主密码将加密过的次密码(也称为 mapped pa
ssword)解密,并对次密码进行认证。
注:如果使用了一次性密码的机制,就不使用密码映射。

所有服务模块必须支持如下4个映射选项(在第四部分已经简单解释过):

1、use_first_pass

这个选项指示本模块不能提示用户输入密码,而是使用已有的密码,即从第一个向用户提示
输入密码的模块那里取得密码,并对该密码进 行认证。

2、try_first_pass

这个选项指示本模块首先尝试使用已有的密码,即从第一个向用户提示输入密码的模块那里
取得密码,并对该密码进行认证。如果密码认 证失败,则再提示用户输入密码。

3、use_mapped_pass

这个选项指示本模块不能向用户提示输入密码,而应使用映射过的密码,即利用主密码将加
密过的次密码解密出来并进行认证。

4、try_mapped_pass

这个选项指示本模块首先尝试使用映射过的密码,即利用主密码将加密过的次密码解密出来
并进行认证。如果密码认证失败,则再提示用 户输入密码。

密码映射的例子:

下面是/etc/pam.conf中关于login服务的配置。这里login共有3种认证机制:Kerberos、UN
IX和RSA认证,两个required控制标志表明用户必 须通过Kerberos认证和UNIX认证才能使用
login服务,optional选项则说明RSA认证是可选的。首先用户输入主密码进行Kerberos认 证
;use_mapped_pass选项指示UNIX认证模块利用主密码将用于UNIX认证的次密码解密出来并对
该次密码进行认证;try_first_pass选项 指示RSA认证模块先使用第一个模块(即Kerberos
模块)的密码作为进行认证的密码,当对该密码认证失败时才提示用户输入用于RSA认 证的
次密码。
login auth required pam_kerb_auth.so debug
login auth required pam_unix_auth.so use_mapped_pass
login auth optional pam_rsa_auth.so try_first_pass

六、PAM API

1、框架API:

任何一个支持PAM的服务程序在进行认证时必须以pam_start( )开始进行初始化,最后以pam
_end( )结束以便进行清理工作。

2、认证管理API:

pam_authenticate( )对用户名/密码进行认证。
pam_setcred( )用来修改用户的秘密信息。

3、帐户管理API:

pam_acct_mgmt( )检查帐户本身是否有权限登录系统、帐户是否过期、帐户是否有登录时间
限制等。

4、密码管理API:

pam_chauthtok( )修改用户的密码。

5、会话管理API:

一个会话以pam_open_session( )开始,最后以pam_close_session( )结束。

6、其它:

pam_get_item( )、pam_set_item( )用来读写PAM事务(transaction)的状态信息。
pam_get_data( )、pam_set_data( )用来取得和设置PAM模块及会话的相关信息。
pam_putenv( )、pam_getenv( )、pam_getenvlist( )用来读写环境变量。
pam_strerror( )返回相关的错误信息。
例子程序(摘自Sun的白皮书):

下面的例子使用PAM API写了一个简单的login服务程序(注:这不是个完整的程序,所以省
略了对pam_close_session的调用)。

#include <security/pam_appl.h>

/* 回调函数 */
static int login_conv(int num_msg, struct pam_message **msg, struct pam_response
**response, void *appdata_ptr);
struct pam_conv pam_conv = {login_conv, NULL};
pam_handle_t *pamh; /* 进行认证的PAM句柄 */

void main(int argc, char *argv[], char **renvp)
{
/* 初始化,并提供一个回调函数 */
if ((pam_start("login", user_name, &pam_conv, &pamh)) != PAM_SUCCESS)
login_exit(1);

/* 设置一些参数 */
pam_set_item(pamh, PAM_TTY, ttyn);
pam_set_item(pamh, PAM_RHOST, remote_host);

while (!authenticated && retry < MAX_RETRIES)
{
status = pam_authenticate(pamh, 0); /* 密码认证管理,检查用户输入
的密码是否正确 */
authenticated = (status == PAM_SUCCESS);
}

if (status != PAM_SUCCESS)
{
fprintf(stderr,"error: %s\n", pam_strerror(pamh, status)); /* 显示错误原
因 */
login_exit(1);
}

/* 通过了密码认证之后再调用帐户管理API,检查用户帐号是否已经过期 */
if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS)
{
if (status == PAM_AUTHTOK_EXPIRED)
{
status = pam_chauthtok(pamh, 0); /* 过期则要求用户更改密码 */
if (status != PAM_SUCCESS)
login_exit(1);
}
}

/* 通过帐户管理检查之后则打开会话 */
if (status = pam_open_session(pamh, 0) != PAM_SUCCESS)
login_exit(status);

/* 设置用户组 */
setgid(pwd->pw_gid);

/*
* Initialize the supplementary group access list before
* pam_setcred because PAM modules might add groups
* during the pam_setcred call
*/
initgroups(user_name, pwd->pw_gid);

status = pam_setcred(pamh, PAM_ESTABLISH_CRED);
if (status != PAM_SUCCESS)
login_exit(status);

/* 设置真实的用户ID(或者有效的用户ID)*/
setuid(pwd->pw_uid);

pam_end(pamh, PAM_SUCCESS); /* PAM事务的结束 */

/*
此处可用来实现与login有关的其它内容
*/
}

/* 出错则清理现场并退出 */
static void login_exit(int exit_code)
{
if (pamh)
pam_end(pamh, PAM_ABORT);
exit(exit_code);
}

/* 这个回调函数被PAM认证模块调用以便显示错误信息或者或者用来取得用户输入,采用图
形界面的服务程序则应使用图形界面来取得 用户输入或显示提示信息*/
int login_conv(int num_msg, struct pam_message **msg, struct pam_response **resp
onse, void *appdata_ptr)
{
while (num_msg–)
{
switch (m->msg_style)
{
case PAM_PROMPT_ECHO_OFF:
r->resp = strdup(getpass(m->msg));
break;
case PAM_PROMPT_ECHO_ON:
(void) fputs(m->msg, stdout);
r->resp = malloc(PAM_MAX_RESP_SIZE);
fgets(r->resp, PAM_MAX_RESP_SIZE, stdin);
/* add code here to remove \n from fputs */
break;
case PAM_ERROR_MSG:
(void) fputs(m->msg, stderr);
break;
case PAM_TEXT_INFO:
(void) fputs(m->msg, stdout);
break;
default:
log_error();
break;
}
}
return (PAM_SUCCESS);
}

七、PAM SPI

当服务程序(ftpd、telnetd等)调用PAM API函数pam_xxx( )时,由PAM 框架(libpam)根
据该服务在/etc/pam.conf文件中的配置调用指 定的PAM模块中对应的SPI函数pam_sm_xxx(
)。如下:

API函数的名字为pam_xxx( ),对应的SPI函数的名字为pam_sm_xxx( ),即每个服务模块需要
引出相应的函数以供libpam调用。为方便对 照,再列一下。

API 对应的 SPI

帐号管理 pam_acct_mgmt( ) pam_sm_acct_mgmt( )

认证管理 pam_authenticate( ) pam_ sm_authenticate( )

密码管理 pam_chauthtok( ) pam_ sm_chauthtok( )

会话管理 pam_open_session( ) pam_ sm_open_session( )

会话管理 pam_close_session( ) pam_ sm_close_session( )

认证管理 pa
m_setcred( ) pam_ sm_setcred( )

八、常用的PAM服务模块

下面是Linux提供的PAM模块列表(只是其中一部分):

模块文件 模块功能描述 相关配置文件

pam_access 提供logdaemon风格的登录控制 /etc/security/access.conf

pam_chroot 提供类似chroot命令的功能

pam_cracklib 对密码的强度进行一定的检查 库文件libcrack和字典文件
/usr/lib/cracklib_dict

pam_deny 总是无条件地使认证失败

pam_env 设置或取消环境变量 /etc/security/pam_env.conf

pam_filter 对输入输出流进行过滤 filters

pam_ftp.so 对匿名ftp用户进行认证

pam_group 当用户在指定的终端上请求指定的 /etc/security/group.conf
服务时赋予该用户相应的组权限

pam_issue 在提示用户输入用户名之前显示 /etc/issue
/etc/issue文件的内容

pam_krb4 对用户密码进行Kerberos认证 相应的Kerberos库文件

pam_lastlog 在用户登录成功后显示关于 /var/log/lastlog
用户上次登录的信息,并维护
/var/log/lastlog文件。

pam_limits 限制用户会话所能使用的系统资源 /etc/security/limits.conf

pam_listfile 根据指定的某个文件决定是否 例如/etc/ftpusers
允许或禁止提供服务

pam_mail 检查用户的邮箱中是否有新邮件 /var/spool/mail/xxxx

pam_mkhomedir 为用户建立主目录 /etc/skel/

pam_motd 显示/etc/motd文件的内容 /etc/motd

pam_nologin 根据/etc/nologin文件的存在与否 /etc/nologin
来决定用户认证是否成功

pam_permit 总是无条件地使认证成功

pam_pwdb 作为pam_unix_xxxx模块的一个替代。/etc/pwdb.conf
使用Password Database通用接口
进行认证。

pam_radius 提供远程身份验证拨入用户服务
(RADIUS)的认证

pam_rhosts_auth 利用文件~/.rhosts和 /etc/hosts.equiv和~/.rhosts
/etc/hosts.equiv对用户进行认证。

pam_rootok 检查用户是否为超级用户,如果
是超级用户则无条件地通过认证。

pam_securetty 提供标准的Unix securetty检查 /etc/securetty

pam_time 提供基于时间的控制,比如限制 /etc/security/time.conf
用户只能在某个时间段内才能登录

pam_unix 提供标准的Unix认证 /etc/passwd和 /etc/shadow

pam_userdb 利用Berkeley DB数据库来检查 Berkeley DB
用户/密码

pam_warn 利用syslog( )记录一条告警信息

pam_wheel 只允许wheel组的用户有超级用户
的存取权限

参考资料:

1、DCE/OSF-RFC 86.0
2、Linux-PAM documentation & source code
3、Sun Solaris PAM documentation


※ 来源: http://sinbad.zhoubin.com

Posted in PAM | Tagged , | Leave a comment

基于PAM的用户认证 (不错,看完了清楚了不少)

原文地址:http://linux.chinaitlab.com/manual/linuxschool/doc078.htm

11.2 基于PAM的用户认证

任何要授予用户特权的程序都要能够进行用户认证。当您登入系统时,您需要提供用 户名和口令,而后登入进程据此以检验登入的合法性—确认您就是该用户。还有除口 令认证之外的其他认证形式,而且口令的存储方式也是各不相同的。

PAM(可插拔认证模块)方式允许系统管理员设置多种认证措施而无须重新编译要进 行认证的程序。使用PAM,您通过编辑一个配置文件来决定认证模块如何插入到程序 之中。大多数红帽子LINUX用户无须改动这个配置文件。因为如果使用RPM来安装程 序的话,系统会自动做有关改动。但是,如果您想定制认证模块的话,就需要理解配 置文件内容。

11.2.1 PAM 模块

PAM定义了四种类型的模块。auth模块提供实际的认证过程,可能是提示口令输入并 检查输入的口令,设置保密字如用户组或KERBEROS通行证。account模块负责检查并 确认是否可以进行认证(比如,帐户是否到期,用户此时此刻是否可以登入,等等)。 password模块被用来设置口令。一旦用户认证通过,session模块将被用来做使用户使用 其帐户前的初始化工作,如安装用户的HOME目录啦,使能用户的电子邮箱啦,等等。

这些模块可以堆叠,多次使用。比如:rlogin通常使用至少两种认证方法,如果“rhosts” 认证成功了,就允许建立连接,否则还要进行标准的口令认证。

随时可以加入新的模块,而PAM感知的程序可以被配置来使用它。举个例子,如果您 有一个一次性口令计算系统,可以写出一个模块来(系统中包含有如何书写模块的文 档资料),PAM感知的程序无须重新编译就可以使用这个新的一次性口令计算器。

11.2.2 服务

每个使用PAM的程序定义它自己的服务名称。login程序定义其服务类型为login,ftpd程序 定义其服务类型为ftp,等等。一般来说,服务类型就是存取该服务的程序的名字,而不 是提供服务的程序。

11.2.3 配置文件

目录/etc/pam.d被用来配置所有的PAM应用程序。(在早期的PAM版本中用的是 /etc/pam.conf;但是若/etc/pam.d不存在的话,仍旧会找/etc/pam.conf,不过记住,这是一个 过时的文件。)。每一个应用程序(确切的说是服务)都有它自己的配置文件。 一个真实的文件可能如下:

#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so shadow
nullok use_authtok
session required /lib/security/pam_pwdb.so

第一行是注释。任何以#开头的行都是注释。以下的三行排列着用于login认证的三个 模块其中第一行用以确认用户是否以root登入,允许登入的tty被列在文件/etc/securetty 中(如果文件存在的话)第二行将会使用户被提示输入口令并校验口令。第三行表示 查文件/etc/nologin是否存在,如果存在就显示其内容,而且如果用户不是root,则禁止 其登入。即便第一个模块失败了,也要完成三个模块的校验。这是一种安全上的考虑 —这种设计永远不要让用户知道他或她们为什么会被拒绝,否则会让其更容易突破认 证。您可以将“required”改成“requisite”来修改这种认证方式。也就是说,如果有任 何“requisite”模块以失败返回,整个PAM认证将终止再调用其它模块也以失败返回。

第五行表示任何必要的记帐信息要被记载。例如,如果设置使用影子口令,pam_db.so 模块将被执行以检查该帐户是否失效或者用户口令是否超期而需要修改。

第六行(该行需要折行来写)用以指定如果login程序改变用户的口令,它应当使用 pam_pwdb.so来完成。(这仅在auth模块检测到口令需要被改变时,例如一个影子口令 已经过期时才使用)

最后一行表示pam_pwdb.so模块将被用来管理当前的会话过程。而目前该模块什么也不做; 它可以被替换为别的所需的模块。

要注意配置文件中每一行的顺序不是任意的。尽管required模块以什么顺序被调用并没 有多大关系,但是还有其它一些控制符,其中optional很少在红帽子LINUX中使用,而 sufficient 和requisite就要求行的顺序不能颠倒。

让我们来看一下rlogin的认证配置:

auth required /lib/security/pam_securetty.so
auth sufficient /lib/security/pam_rhosts_auth.so
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_nologin.so

这和login的描述极为相似,但是其中比login的多一行模块描述,而且模块的顺序也不同。 首先,pam_securetty.so模块将禁止以root从不安全的终端登入。这将有效的阻止任何root方 式的远程登入。如果您不想禁止的话(在这种情况下,我们建议您的机器要么没和Internet 相连,要么呆在一个配置良好的防火墙后面),把这一行删掉就是了。其次,pam_nologin.so 模块将检查/etc/nologin,如上所述。第三点,如果pam_rhosts_auth.so模块认证通过,PAM就立 即以成功返回而不再做任何口令校验。如果pam_rhosts_auth.so认证失败,该失败将被忽略, 继续调用pam_pwdb.so模块进行正常的口令认证。如果您在securetty认证失败后不想让系统继续 以口令询问的话,您可以把pam_securetty.so模块的required 改为 requisite。

11.2.4 影子口令

pam_pwdb.so模块会自动检测您是否使用影子口令以做出相应的调整。请查看第 11.3 节获得更多有关操纵影子口令工具的信息。

11.2.5 更为详尽的信息

本章描述的仅仅是PAM的介绍性知识。更多的资料位于系统的/usr/doc/pam*,其中包含 了系统管理员指南,模块书写手册,应用系统开发者手册,和PAM标准说明DCE-RFC 86.0。同时,这些文档也可以从红帽子的WEB站点获得,http://www.redhat.com/linux-info/pam/.

Posted in PAM | Tagged , | Leave a comment

The Linux-PAM Administrator Guide (1)

The Linux-PAM Administrator Guide

原文地址: http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_SAG.html
作者:Andrew G. Morgan, morgan@linux.kernel.org
翻译:孙国清(Thomas Sun),thomassun@yeah.net
DRAFT v0.71 1999/11/8 这个文档所涉的是系统管理员须知的关于Linux-PAM库的知识. 它涉及了设置PAM的正确语法并讨论维护一个可靠系统的正确的策略.
1. 介绍

Linux-PAM (Linux下的可插入式认证模组) 是一套共享函数库,允许系统管理员来决定应用程式如何识别用户.

换句话说,就是用不着(重写和)重新编译一个(支援PAM的)程式,就可以切换它所用的认证机制. 你可以整个的升级你的认证系统而不用去管应用程式本身.

传统上,当一个应用程序有身份识别的需求,它就不得不把某一种验证算法写进去. 例如,就传统的UN*X系统而言,核对使用者身份的方法就是要求用户输入正确的密码. 这密码,除了开头的两个字符作为"salt",剩下的是加密过的(经由crypt(3)). 接著用户被验证这个加密过的密码是否与他在密码档(就是/etc/passwd文件)中他的那笔记录的第二栏相符.在这样的系统里,绝大部份权限的授予是基于这种单一的认证机制. 权限决定于个人的识别码(uid)和不同群组的成员.服务和程式是否可用由个人和群组的识别码决定.传统上,群组关系经由/etc/group文件中的记录来赋予.

不幸的是,随着计算机速度的不断提高,再加上满世界的关于网路计算的介绍,使得象这样曾是安全的验证机制,变得易受攻击了.面对这样的现实,新的验证方法正在持续的开发中.

Linux-PAM项目的目标是把赋权部分的开发以可靠的合适的鉴定模式从软件中分离出来。这目标已经通过提供一组库函数实现了,应用程序可以用这些函数来请求验证某个用户。这个 PAM 由特定的系统文件配置,/etc/pam.conf (或者是在/etc/pam.d/里的一系列配置文件)  以经由特定的可用的认证模组来鉴定某个用户的请求。 这些个模组通常位于/usr/lib/security目录并且以可动态加载的目标文件的形式出现 (参见 dlopen(3)).
2. 文中的说明

在继续阅读之前, 请记住本文假定提到的文件位于默认的目录。这个默认的目录我们遵循RFC(RFC-86.0,见 bibliography) 中的约定。如果你正用一个支持PAM但是却选择以不同的方式发布这些文件的发布版的Linux(或是其他的OS) (Red Hat就是这样的发布版),  那你从文章中直接拷贝例子的时候就要注意一下了.

举个例子, where it is explicit, 本文假定PAM可加载目标文件(就是 模块)位于这个目录:  /usr/lib/security/. 可是, Red Hat Linux, 为遵循Linux文件系统标准(the FSSTND),把这些文件放在/lib/security. 在使用本文的例子时请小心的做一些转换的工作。
3. 概观

For the uninitiated,我们开始于考虑一个例子。我们来说说一个应用程序提供一些服务给用户; login 就是这样的程序。  Login 做两件事,它首先确认提出请求的用户正是他们自己,第二步提供给他们所请求的服务: 就login而言服务即是一个命令行外壳(command shell)(如bash,tcsh,zsh之类。)以这个用户的身份去跑。

传统上,前一个步骤通过login提示用户输入密码然后确认系统是否同意登入;接着确认(就系统而言)用户确实是提出要求的那人。这类工作就是Linux-PAM的典型应用。

从应用程序员的角度看(在这个例子里就是写login程序的人), Linux-PAM处理认证的工作——确认用户的身份。

Linux-PAM的弹性在于,你,系统管理员有权来决定实施怎样的验证方案。你有权来设定你的系统里的任何支持PAM的应用程序的验证方案。就是说,你可以将验证方案设计成单纯的信任>;任何人(pam_permit)到像偏执狂似的通过视网膜扫描,声音识别和一个密码!

举例说明你所面对的弹性,考虑以下情形:系统管理员(家中的父母)希望提高他的使用者(孩子们)的算术能力。她可以设置他们喜欢玩的 “Shoot ’em up”(游戏,当然得支持PAM)通过提问小于12的一对随机数的乘积的办法来进行认证。很明显不管游戏本身如何,他们会很快学会乘法表。等他们再大些,认证可以升级到包括多位除法!(译者:我已经准备用这种办法来教我宝贝女儿学加减乘除了。)

Linux-PAM处理四种独立的(管理)工作。它们是: 认证管理; 帐号管理; 会话期间管理;和密码管理。  The association of the preferred management scheme with the behavior of an application is made with entries in the relevant Linux -PAM configuration file. 管理的功能由配置文件中指定的模块 来完成。这文件的语法在 below部分讨论。

下面的插图描述了Linux-PAM的整个组织结构。

By way of explanation, 图的左边表示一个应用程序:X. 这应用程序有和Linux-PAM 库的接口并且在认证方面没有什么特别之处. Linux-PAM 函数库 (图的中部) 查询PAM配置文件的内容并且装入适用于程序 X 的模块. 这些模块进入四个管理组(  图的中下部)中的一个,并且以它们出现在配置文件中的顺序堆叠起来 . 这些模组由Linux-PAM呼叫后,为应用程序执行不同的认证工作 . 需要用户提供或提供给用户的文本信息,可以通过使用应用程序提供的conversation函数来交换.

3.1 Getting started

以下段落由Seth Chaiklin供稿:

到现在为止,我们描述了PAM如何工作在一个理想世界里,
在这儿所有应用程序都被正确编写.
然而,到此时(1998年10月), 这距离现实还太远.
因此,在你试图把PAM用于你的系统时,还得考虑一些实际因素.

Why bother, is it really worth all the trouble? 

如果你运行Linux作为单用户系统, 或者在一个所由用户都可信任的环境, 那么用PAM就没什么实际优势.

Ed: 事实上还是有一个好处, 你可以令认证变哑, 就象没有任何认证….像Win95.

在网络环境里, 很显然,关于用户你必需多想点, it is clear that you need to think a little more about how users etc., are authenticated:]

如果运行Linux作为服务器, 提供一些不同的服务 (e.g., 经由密码控制的WWW区域限制, PPP),
那PAM就有一些实际的和有趣的价值. 尤其是, 通过使用使用模块, PAM 能够使
一个程序经过几个不同的密码库来查找, 哪怕那个程序没有专为那密码库写的代码.
下面有一些例子Here are some examples of the possibilities
that this enables.

   o  Apache 有一个模块提供PAM服务.  认证特定的目录权限可以让PAM来控制,
      这意味着,所有PAM能调用的模块都可以被Apache使用,包括RADIUS,NIS,NCP
      (NCP用来经由Novell的密码库认证).

   o  pppd 有一个PAM化了的版本(来自 RedHat)  现在有可能用一系列的数据库来验证
      ppp用户. 作为对基于Linux的密码库(/etc/passwd,/etc/shadow)的扩充, 你可以
      用PAM模块来进行基于Novell密码库或NT(NTLM)密码库的认证.

   o  以上两则例子可以有组合应用.想象一下你办公室/部门的用户已经经过用户名/密码
      认证登入Novell或NT.如果你想要他在Linux下的应用也用相同的用户名/密码
      (为PPP登入,web服务,或者只是普通的shell登入),你可以通过PAM进行基于这些已
      存在的数据库(译者注:Novell的或者NT的)的用户认证,而无须在Linux和LAN服务器里
      各自维护独立的数据库.

我可以让所有需要有用户认证的程序都来用PAM吗?

有的可以,有的不行.可以的是那些你能得到源代码,并且可以加入适当的PAM函数的程序.
不行的是那些你无法得到源代码,并且可执行程序没有加入PAM的功能.

也就是说, 如果一个程序打算要用PAM,那么它必须在程序里直接的包含PAM函数.
不这样做就不可能用PAM.

我怎么知道程序是否已经含有PAM的代码了呢?

一个快速的(但不总是可靠)的方法是执行ldd <程序>;
如果 libpam 和 libpam_misc 不在程序所需的函数库之列,那么它将不会用PAM.
然而,这两个函数库还是可能已经包含进程序了,不过问题依然存在,因为把PAM
写死在程序不会如你期望的工作.所以一个更可靠的方法是做一下的测试:

在/etc/pam.d目录里,需要为程序设有一个配置文件.具体的文件名是写死在程序里的.
通常和程序名一样,但却不总是这样.为举例说明,假设程序名字叫"pamprog",配置文件
是/etc/pam.d/pamprog.

在/etc/pam.d/pamprog里写这两行:

auth    required  pam_permit.so
auth    required  pam_warn.so

现在试着执行pamprog. 配置文件的第一行是说所有用户都被允许. 第二行会在你的
syslog 文件(或者其它你的syslog会写的文件) 里写一个warning.
如果这测试是成功的,那么你就知道你有一个"懂"pam的程序,并且你可以开始更有趣的工作:
决定如何在你的/etc/pam.d/pamprog里堆彻PAM模块.

4. Linux-PAM的设定档

Linux-PAM 给系统管理员提供了相当大的弹性来设定系统里程式的权限赋予. 由PAM控制的系统安全的本地配置可以包含在以下两个地方:  或者是一个单一的系统文件: /etc/pam.conf; 或者是/etc/pam.d/ 目录下的文件. 本章我们来讨论这些文件的语法和一般的选项.
4.1 设定档的语法

请注意, 在这些文件里 Linux-PAM 特有的符号是不区分大小写的. 而模块的路径,是大小写敏感的,因为它标识的是Linux下的文件的名字. 而任何模块参数的大小写分别由各个模块定义.

除以下的行之外,为系统管理员方便,还有两个特殊的字符: 注解由’#’开头,结束于行结束,另外,模块的描述行可以以 ‘\’脱字符延续到下一行.

通常/etc/pam.conf里的每一行有以下格式:

service-name   module-type   control-flag   module-path   arguments

接下来,我们来解释每个栏位的意思.另一种(也是常被采用的)设置Linux-PAM 的方法是通过/etc/pam.d/里的文件来实现.在我们解释完上面的那行之后, 我们就来讨论这种方法.

service-name

    这笔记录相关的服务名称.通常这服务名称是特定应用程序的名字.比如, `ftpd’, `rlogind’ 和 `su’ 这些. .

    有一个保留的服务名称,它是用来定义默认的认证机制的. 它就是`OTHER’,大小写无关.注意,当已经有为指定服务定义了模块,那么 `OTHER’ 记录会被忽略.
module-type

    模块的四种(目前是)类型.这四种类型是:

        * auth; 这种模块类型确定有关用户认证的两方面. 第一,它确认用户就是他们自己,这通过指示应用程序提示用户输入密码或者其它证实身份的方法.第二,这类模块会赋予成员资格 Secondly,  the module can grant group membership (independently of the /etc/groups file discussed above) or other privileges through its credential granting properties.
        * account; 这些模块处理非认证级的帐号管理. 典型的用法是基于一天的不同时间段来限制/允许访问某服务,当前可用的系统资源 (最大用户数)或者限制特定用户—‘root只能从控制台登录.
        * session; 首先, 这类模块和一系列动作有关,指在用户得到/失去服务时要做的事. 这包括记录用户的登录/登出,挂载必须的目录等等.
        * password; 这最后一种类型在更新用户的认证标志时需要. 通常,各个基于"质问/回答"(译注:指传统的用户名/密码的认证方法)的认证方法(auth)有一个对应的此模块.

control-flag

    控制符用来指示当某一模块返回成功或失败时PAM如何动作. 既然模块可以被堆叠 (同种类型的模块按先后顺序执行,一个接一个), 控制符决定每个模块的重要程度.应用程序不会直接接收’/etc/pam.conf’ 里列出的每一个模块的成功或失败的结果. 相应的是,它只从 Linux-PAM接收一个 成功 或 失败 的结论. 这些模块的执行顺序就是它们在 /etc/pam.conf里的记录的顺序;排在前面的记录在排在后的记录之前被执行. 在Linux-PAM 0.60版本里, 这个control-flag 可以有两种语法来定义.

    简单一些(也是过去的)语法是用一个限定词指示相关模块的重要程度. 有四个关键字: required, requisite, sufficient 和 optional.

    Linux-PAM 将这四个关键字解释为:

        * required; 需要的,这表明此模块返回成功值对于整个module-type的成功是必要的. 此模块的返回失败并不会传回给用户直到剩下的模块(同样module-type)都执行过.
        * requisite; 必要的,类似 required, 只不过, 当这类模块返回失败时,整个控制会立刻回到应用程序.  返回值同第一个 需要的 或 必要的模块返回的失败. 注意,这标志可以用来防止  required or requisite module to fail. Note, this flag can be used to protect against the possibility of a user getting the opportunity to enter a password over an unsafe medium. It is conceivable that such behavior might inform an attacker of valid accounts on a system. This possibility should be weighed against the not insignificant concerns of exposing a sensitive password in a hostile environment.
        * sufficient;  充分的,这模块返回的成功会被认为已经 充分满足Linux-PAM 库确认这类模块 (module-type)是成功的条件. 如果没有先前的requisite 模块返回了失败,那么不再会有其它’堆叠’ 的模块被呼叫. (注意,  这种情况下,随后的requisite 模块就不会 被呼叫.). 这模块返回的失败不会看作是致命的错误而至影响应用程序从这module-type  得到成功的结果.
        * optional; 可选的,正如这名字一样,此 control-flag 致使模块对最终的成功或失败的结果不会产生决定性的影响. 一般,Linux-PAM 在确定整个模块堆成功活失败时忽略这模块. 然而, 当从之前或后续的模块得不到明确的成功或失败的结果时,这模块将决定返回给应用程序的状态. 后种情况会出现在比如当其它模块返回PAM_IGNORE 时.

    更复杂(新)的语法则更明确,使管理员有更多的控制用户认证的空间. 这种控制符以方括号包含,由一系列的value=action 对组成:

    [value1=action1 value2=action2 …]

    这里的 valueI 有以下值 return values: success; open_err; symbol_err;  service_err; system_err; buf_err; perm_denied; auth_err; cred_insufficient;  authinfo_unavail; user_unknown; maxtries; new_authtok_reqd; acct_expired;  session_err; cred_unavail; cred_expired; cred_err; no_module_data; conv_err;  authtok_err; authtok_recover_err; authtok_lock_busy; authtok_disable_aging;  try_again; ignore; abort; authtok_expired; module_unknown; bad_item; conv_again;  incomplete; 和 default. 最后的 (default) 被用来定义当没有明确定义时的默认动作.

    actionI 可以是一个正数或者是以下标识: ignore; ok; done; bad; die; 和 reset. 当以一个正数J 作为action 时,它的作用是指示以下J个模块将被跳过. 通过这种手段, 管理员可以开发出适度复杂的模块堆叠,它以许多不同的路径执行. 至于以何种路径则决定于某个模块的反应.

        * ignore – 此类模块的返回状态将不会影响应用程序所得到的返回值.
        * bad – 这表示相应的返回值将被认为是模块失败. 如果此模块是堆叠中的第一个失败的模块, 它的状态值将作为整个堆叠的状态.
        * die – 和 bad 相同,不过会终止整个模块堆叠,PAM立即返回到应用程序.
        * ok – 这告诉PAM 管理员要让此返回值直接作用于整个模块堆叠的返回. 换句话说, 如果堆叠的原先状态会导致返回  PAM_SUCCESS, 这模块的返回值将会覆盖这结果. 请注意:如果堆叠的原先状态保存着一些意为模块失败的值,这’ok’将不会用来覆盖那样的值.
        * done – 和 ok 一样, 不过会终止整个模块堆叠, PAM立即返回到应用程序.
        * reset – 清除储存模块堆叠状态的内存并且重新开始下一组堆叠.

    来体会一下这种新语法的强大之处, 从 Linux-PAM-0.63起, 客户插件代理的概念被引进. 这多少使PAM支援从C/S应用程序固有的传输协议进行机器-机器的认证成为可能.(?) 通过 “[ … value=action … ]” 的语法, 使应用程序对支援binary prompt?的客户端采用binary prompt?, 而对旧有的客户端则向后兼容的采用另一种认证模式. 够灵活吧?
module-path

    是可动态加载目标文件的路径; 也即可插入式模块 本身. 如果路径的首字符是 `/’, 那它被作为一个完整路径. 如果不是这样, 那模块的路径则会加上默认的模块路径: /usr/lib/security (见 above).
args

    args 是一组传给模块的参数. 类似一般Linux的指令的参数. 通常, 合法的参数是可选的并且是模块特有的. 无效的参数会被模块忽略, 可是, 当抓到一个无效参数, 模块被要求写一个错误信息到 syslog(3). 下一节有一个一般 选项的列表.

设定档里如果有任一行有格式错误, 那通常会导致认证流程失败. 相应的错误信息会通过呼叫syslog(3)写入系统日志.
4.2 基于目录的设定

从0.56版开始有比单个配置文件更灵活的做法, 可以通过/etc/pam.d/里的文件来配置libpam. 这种方法,/etc/pam.d/里的文件名和服务名(service-name)相同(小写): 这是各服务的个性化设置档.

Linux-PAM 可以编译成两种模式之一. 首选的模式是使用/etc/pam.d/ 或/etc/pam.conf设定,但不是同时两者皆可.也就是说, 如果</etc/pam.d/目录存在那么libpam仅使用这目录里的文件当作设定档. 当/etc/pam.d/不存在时就用 /etc/pam.conf. 另一种模式是(是RedHat4.2以上版本的模式)按顺序同时用/etc/pam.d/和 /etc/pam.conf. 在这种模式下,/etc/pam.d/里的设定会覆盖/etc/pam.conf.

/etc/pam.d/里的文件的语法和/etc/pam.conf相似,由以下格式组成:

module-type   control-flag   module-path   arguments

唯一的差别是service-name不再出现.service-name是给定的配置文件名. 例如,/etc/pam.d/login 里包含了login的配置.

此种设置方法比起处理单个文件有很多优点. 列举如下以帮助读者来决定采用何种方案:

    * 遗漏应用程序的配置的机会比较小. 当手工编辑设定档时也少设定一个栏位.
    * 更易于维护. 配置某个应用程序不会有妨碍到别的应用程序的危险.
    * 建立不同的服务的配置文件为到某个文件的符号连接也是可能的. 这使保持不同的应用程序采用一致的系统策略变得容易些.  (It should be noted, to conserve space, it is equally possible to hard link a number of configuration files. However, care should be taken when administering this arrangement as editing a hard linked file is likely to break the link.)
    * 更快的配置文件解析,只有和此服务相关的条目才会解析.
    * 采用文件系统的文件权限可以限制个别Linux-PAM设定档的读权限.
    * 包管理变得更简单. 每次当有新程序安装时,只需要附上/etc/pam.d/xxxxxx.

4.3 通用的可选参数

一下是一些基本所有模块都识别的可选参数.参数(包含这些)通常是可选的.

debug

    呼叫 syslog(3) 函数在系统日志里记录下debug信息.
no_warn

    指示模块不要丢warning信息给应用程序.
use_first_pass

    这模块将不会提示用户输入密码,它可以得到前面输入过的密码(从上一个auth模块)并且用它.如果那密码不正确,那么用户就不被认证.(这模块只对auth和password模块有意义.)
try_first_pass

    这模块会先拿前面输入过的密码来认证(从上一个auth模块).如果通不过认证,就提示用户输入密码.(这模块只对auth模块有意义.)
use_mapped_pass

    这参数目前没有任何Linux-PAM发布的模块支援,因为可能会违反美国加密软件出口限制.在美国国内,模块开发者当然可以自由的实现它(他国的开发者也一样).  For compatibility reasons we describe its use as suggested in the DCE-RFC 86.0, see section bibliography for a pointer to this document.

    use_mapped_pass 指示模块拿前一个模块生成的认证明文来产生一个加/解密的的键 ,以这键来安全的存储/取得此模块所需的认证标识.  In this way the user can enter a single authentication token and be quietly authenticated by a number of stacked modules. Obviously a convenient feature that necessarily requires some reliably strong encryption to make it secure. This argument is intended for the auth and password module types only.
expose_account

    通常模块暴露用户帐号的有关信息不是个安全的策略. 有时象用户名,用户的家目录,首选的shell这些信息可被用来攻击这帐号. 可是,这些信息不被视为威胁:在一个可信的环境里当要求输入密码时显示用户的全名, 这被叫做"易用性".expose_account是个标准的模块参数,当管理员觉得合适(译注: 指暴露用户帐号的信息)时可以使模块和帐户信息少些离散.

4.4 设定档的范例

在这章,我们给出一些可以出现在Linux-PAM的设定档里的条目的范例. 作为第一次尝试配置你的系统,你可能会得的比实现它们更糟糕.
默认策略

对于关键的系统,最好是有个适度安全的OTHER条目.以下是个"偏执狂"的设定 (以此开始不是个坏想法!):

#
# default; deny access
#
OTHER   auth     required       /usr/lib/security/pam_deny.so
OTHER   account  required       /usr/lib/security/pam_deny.so
OTHER   password required       /usr/lib/security/pam_deny.so
OTHER   session  required       /usr/lib/security/pam_deny.so

Whilst fundamentally a secure default, this is not very sympathetic to a misconfigured system. For example, such a system is vulnerable to locking everyone out should the rest of the file become badly written.

pam_deny (在后面的章节里解释)不够复杂.比如,它被呼叫时不会记录任何信息, 如此除非用户告诉管理员说他不能执行某应用程序,管 …

Posted in PAM | Tagged , | Leave a comment

Google搜索从入门到精通[转]

本文简要的介绍了Google的历史和特点,Google的基本搜索语法和高级搜索语法,Google的特色功能, 包括图片搜索、新闻组搜索和集成工具条等。尽管本文名为“Google搜索从入门到精通”,但事实上,本文只能算是对Google的一个并不十分完全的介 绍而已。:smile:


1,前言

我 是在2000年上半年知道Google的。在这之前,我搜索英文信息通常用AltaVista,而搜索中文信息则常用Sina。但自使用了Google之 后,它便成为我的Favorite Search engine了。这也得感谢新浪网友曹溪,因为当初正是因为他的大力推介,才使我识得了Google。

记得1996年夏季的时候,当我第一次接触Internet,便被扑面而来的魔力征服了。那种天涯咫尺的感觉,真是妙不可言。在经历了疯狂的WWW冲浪和如痴如醉的BBS沉迷之后,我意识到Internet对我影响至深的还是在于学习方式的变迁。

如 何来描述这种变迁呢?以前的学习,一般需要预先在肚子里存储下足够的知识,必要时,就从海量的信息中提取所需的部分。这种学习方式造就了很多“才高八斗, 学富五车”的大才子。但是,到了信息领域大大超出“四书五经”的新时期,预先无目的的吞下海量信息的学习方式就有些不合时宜了。比方说,我们到了大型的图 书城,往往有一种不知所措的感觉。旧有的学习方式需要变更以适应这个信息爆炸的年代。目的明确的去学习,即先知道要学什么,然后有目的的去寻找答案,这种 方式看上去更加有效率。我不妨把这称为“即学式”,相应的,旧有的称为“预学式”。

不过,“即学式”的实施是有前提的。首先,要求学习者 拥有一个包罗万象的信息库,以供随时抽取各种目的信息;其次,是需要一个强劲的信息检索工具,以便高效率的从信息库中提取信息。很明显,Internet 可以充当那个海量的信息库,而搜索引擎,则正是寻找光明之火的绝好工具。

“公欲善其事,必先利其器”。Internet只有一个,而搜索 引擎则有N多个。有搜索高手说,所谓搜索,就是“在正确的地方使用正确的工具和正确的方法寻找正确的内容”。但是,对于普通人而言,掌握诸多搜索引擎的可 能性似乎不大。用一两个相对强劲的具代表性的工具达到绝大多数搜索目的更为人们所迫切希望。不同的时期,涌现出不同的强者。就目前而言,我们非常幸运的有 了: *****Google******

2,摘要

本文简要的介绍了Google的历史和特点,Google的 基本搜索语法和高级搜索语法,Google的特色功能,包括图片搜索、新闻组搜索和集成工具条等。尽管本文名为“Google搜索从入门到精通”,但事实 上,本文只能算是对Google的一个并不十分完全的介绍而已。:smile:

3,如何使用本文

阅 读本文最好具备一些最基本的布尔代数基础,如“与”、“或”、“非”等。不过,即便你没有这方面的知识,也不必在意。对那些实例进行练习,你的疑惑就会迎 刃而解。对于刚刚接触网络搜索的读者而言,也许你应该从头到尾的阅读本文;但对于那些有一定搜索基础的读者而言,只需要跳跃着寻找自己所需要的信息就可以 了。此外,你也可以参考中文Google大全:http://www.Google.com/intl/zh-CN/about.html,以及搜索帮 助:http://www.google.com/intl/zh-CN/help.html,那是官方Google使用手册以及问题解答中心。

4,Google简介

Google (www.Google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于1999年创立。2000年7月份,Google替代Inktomi成为Yahoo公司的搜索引擎,同年9月份,Google成为中国网易公司的搜索引 擎。98年至今,Google已经获得30多项业界大奖。到Google的新闻中心(http: //www.Google.com/press/index.html),你可以找到关于一切关于Google的历史和新闻资料。

Google的成功得益于其强大的功能和独到的特点:

Google检索网页数量达24亿,搜索引擎中排名第一;
Google支持多达132种语言,包括简体中文和繁体中文;
Google网站只提供搜索引擎功能,没有花里胡哨的累赘;
Google速度极快,年初时据说有15000多台服务器,200多条T3级宽带;
Google的专利网页级别技术PageRank能够提供准确率极高的搜索结果;
Google智能化的“手气不错”功能,提供可能最符合要求的网站;
Google的“网页快照”功能,能从Google服务器里直接取出缓存的网页。

Google具有独到的图片搜索功能;
Google具有强大的新闻组搜索功能;
Google具有二进制文件搜索功能(PDF,DOC,SWF等);
Google还有很多尚在开发阶段的令人吃惊的设想和功能。
等等

5,搜索入门

要 用Google做搜索,当然首先要进Google网站–www.Google.com;不过,163.com和yahoo.com.cn使用的实际上也 是Google搜索引擎,只是对搜索结果进行了编排,而且无法提供一些特色功能,如图片搜索等。因此,如果你要搜索网页的话,就直接使用 Google.com吧。

第一次进入Google,它会根据你的操作系统,确定语言界面。需要提醒的是,Google是通过cookie来存储页面设定的,所以,如果你的系统禁用cookie,就无法对Google界面进行个人设定了。

Google 的首页很清爽,LOGO下面,排列了四大功能模块:网站、图像、新闻组和目录服务。默认是网站搜索。现在进行第一次搜索实践,假定你是个搜索新手,想要了 解一下搜索引擎的来龙去脉和搜索技巧。在搜索框内输入一个关键字“搜索引擎”, 选中“搜索中文(简体)网页”选项,然后点击下面的“Google搜索”按钮(或者直接回车),结果就出来了。 搜索:“搜索引擎”
结果:已搜索有关搜索引擎的中文(简体)网页。 共约有707,000项查询结果,这是第1-10项 。 搜索用时0.08秒。

仔细看一下搜索结果的前十项,就会发现绝大部分链接是搜索引擎本身,而不是对搜索引擎的或者搜索技巧方面的介绍。

注意:文章中搜索语法外面的引号仅起引用作用,不能带入搜索栏内。

6,初阶搜索

上例是最基本的搜索,即查询包含单个关键字的信息。但是,你可以发现,上例中,单个关键字“搜索引擎”,搜索得的信息浩如烟海,而且绝大部分并不符合自己的要求,怎么办呢?我们需要进一步缩小搜索范围和结果。

6.1,搜索结果要求包含两个及两个以上关键字

一般搜索引擎需要在多个关键字之间加上“ ”,而Google无需用明文的“ ”来表示逻辑“与”操作,只要空格就可以了。现在,我们需要了解一下搜索引擎的历史,因此期望搜得的网页上有“搜索引擎”和“历史”两个关键字。

示例:搜索所有包含关键词“搜索引擎”和“历史”的中文网页
搜索:“搜索引擎 历史”
结果:已搜索有关搜索引擎 历史的中文(简体)网页。 共约有78,600项查询结果,这是第1-10项 。 搜索用时0.36秒。

用 了两个关键字,查询结果已经从70多万项减少到7万多项。但查看一下搜索结果,发现前列的绝大部分结果还是不符合要求,大部分网页涉及的“历史”,并不是 我们所需要的“搜索引擎的历史”。 怎么办呢?删除与搜索引擎不相关的“历史”。我们发现,这部分无用的资讯,总是和“文化”这个词相关的,另外一些常见词是“中国历史”、“世界历史”、 “历史书籍”等。

6.2,搜索结果要求不包含某些特定信息

Google用减号“-”表示逻辑“非”操作。“A –B”表示搜索包含A但没有B的网页。

示例:搜索所有包含“搜索引擎”和“历史”但不含“文化”、“中国历史”和“世界历史”的中文网页
搜索:“搜索引擎 历史 -文化 -中国历史 -世界历史”
结果:已搜索有关搜索引擎 历史 -文化 -中国历史 -世界历史的中文(简体)网页。 共约有36,800项查询结果,这是第1-10项 。 搜索用时0.22秒。

我们看到,通过去掉不相关信息,搜索结果又减少了将近一半。第一个搜索结果是:

搜索引擎直通车≡搜索引擎发展历史
搜索引擎直通车, … 搜索引擎专业介绍站点. …
www.se-express.com/about/about.htm – 14k – 网页快照 – 类似网页

非常符合搜索要求。另外,第八项搜索结果:

463搜索王
本站检索 整个网站 在此输入关键词. 你的当前
位置:首页 >> Internet搜索手册 >> 搜索引擎的历史. …
www.cnco.net/search/history.htm – 21k – 网页快照 – 类似网页

也 符合搜索要求。但是,10个结果只有两个符合要求,未免太少了点。不过,在没有更好的策略之前,不妨先点开一个结果看看。点开se- express.com的这个名为“搜索引擎发展历史”的网页,我们发现,搜索引擎的历史,是与互联网早期的文件检索工具“Archie”息息相关的。此 外,搜索引擎似乎有个核心程序,叫“蜘蛛”,而最早成型的搜索引擎是“Lycos”,使搜索引擎深入人心的是“Yahoo”。了解了这些信息,我们就可以 进一步的让搜索结果符合要求了。

注意:这里的“ ”和“-”号,是英文字符,而不是中文字符的“+”和“-”。此外,操作符与作用的关键字之间,不能有空格。比如“搜索引擎 – 文化”,搜索引擎将视为关键字为“搜索引擎”和“文化”的逻辑“与”操作,中间的“-”被忽略。

6.3,搜索结果至少包含多个关键字中的任意一个。

Google 用大写的“OR”表示逻辑“或”操作。搜索“A OR B”,意思就是说,搜索的网页中,要么有A,要么有B,要么同时有A和B。在上例中,我们希望搜索结果中最好含有“archie”、“lycos”、“蜘 蛛”等关键字中的一个或者几个,这样可以进一步的精简搜索结果。

示例:搜索如下网页,要求必须含有“搜索引擎”和“历史”,没有“文化”,可以含有以下关键字中人任何一个或者多个:“Archie”、“蜘蛛”、“Lycos”、“Yahoo”。
搜索:“搜索引擎 历史 archie OR 蜘蛛 OR lycos OR yahoo -文化”
结果:已搜索有关搜索引擎 历史 archie OR 蜘蛛 OR lycos OR yahoo -文化的中文(简体)网页。 共约有8,400项查询结果,这是第1-10项 。 搜索用时0.16秒。

我们看到,搜索结果缩小到8千多项,前20项结果中,大部分都符合搜索要求。如果你想了解一下解搜索引擎的历史发展,就不妨研究一下现在搜索到的结果吧。 注意:“与”操作必须用大写的“OR”,而不是小写的“or”。

在 上面的例子中,我介绍了搜索引擎最基本的语法“与”“非”和“或”,这三种搜索语法Google分别用“ ”(空格)、“-”和“OR”表示。顺着上例的思路,你也可以了解到如何缩小搜索范围,迅速找到目的资讯的一般方法:目标信息一定含有的关键字(用“ ”连起来),目标信息不能含有的关键字(用“-”去掉),目标信息可能含有的关键字(用“OR”连起来)。

7,杂项语法

7.1,通配符问题

很 多搜索引擎支持通配符号,如“*”代表一连串字符,“?”代表单个字符等。Google对通配符支持有限。它目前只可以用“*”来替代单个字符,而且包含 “*”必须用""引起来。比如,“"以*治国"”,表示搜索第一个为“以”,末两个为“治国”的四字短语,中间的“*”可以为任何字符。

7.2,关键字的字母大小写

Google对英文字符大小写不敏感,“GOD”和“god”搜索的结果是一样的。

7.3,搜索整个短语或者句子

Google的关键字可以是单词(中间没有空格),也可以是短语(中间有空格)。但是,用短语做关键字,必须加英文引号,否则空格会被当作“与”操作符。

示例:搜索关于第一次世界大战的英文信息。
搜索:“"world war I"”
结果:已向英特网搜索"world war i". 共约有937,000项查询结果,这是第1-10项 。 搜索用时0.06秒。

7.4,搜索引擎忽略的字符以及强制搜索

Google对一些网路上出现频率极高的英文单词,如“i”、“com”、“www”等,以及一些符号如“*”、“.”等,作忽略处理。

示例:搜索关于www起源的一些历史资料。
搜索:“www的历史 internet”
结果:以下的字词因为使用过于频繁,没有被列入搜索范围: www 的. 已搜索有关www的历史 internet的中文(简体)网页。 共约有75,100项查询结果,这是第1-10项 。 搜索用时0.22秒。

我 们看到,搜索“www的历史 internet”,但搜索引擎把“www”和“的”都省略了。于是上述搜索只搜索了“历史”和“internet”。这显然不符合要求。这里我顺便说一 点搜索引擎分词的知识。当我们在搜索“www的历史”的时候,搜索引擎实际上把这个短语分成三部分,“www”、“的”和“历史”分别来检索,这就是搜索 引擎的分词。所以尽管你输入了连续的“www的历史”,但搜索引擎还是把这个短语当成三个关键字分别检索。

如果要对忽略的关键字进行强制搜索,则需要在该关键字前加上明文的“+”号。
搜索:“+www +的历史 internet”
结果:已搜索有关+www +的历史 internet的中文(简体)网页。 共约有25,000项查询结果,这是第1-10项 。 搜索用时0.05秒。

另一个强制搜索的方法是把上述的关键字用英文双引号引起来。在上例“”world war I””中,“I”其实也是忽略词,但因为被英文双引号引起来,搜索引擎就强制搜索这一特定短语。

搜索:“"www的历史" internet”
结果:已搜索有关"www的历史" internet的中文(简体)网页。 共约有7项查询结果,这是第1-6项 。 搜索用时0.26秒。

我们看到,这一搜索事实上把“www的历史”作为完整的一个关键字。显然,包含这样一个特定短语的网页并不是很多,不过,每一项都很符合要求。

注意:大部分常用英文符号(如问号,句号,逗号等)无法成为搜索关键字,加强制也不行。

8,进阶搜索

上面已经探讨了Google的一些最基础搜索语法。通常而言,这些简单的搜索语法已经能解决绝大部分问题了。不过,如果想更迅速更贴切找到需要的信息,你还需要了解更多的东西。

8.1,对搜索的网站进行限制

“site”表示搜索结果局限于某个具体网站或者网站频道,如“www.sina.com.cn”、“edu.sina.com.cn”,或者是某个域名,如“com.cn”、“com”等等。如果是要排除某网站或者域名范围内的页面,只需用“-网站/域名”。

示例:搜索中文教育科研网站(edu.cn)上关于搜索引擎技巧的页面。
搜索:“搜索引擎 技巧 site:edu.cn”
结果:已搜索有关搜索引擎 技巧 site:edu.cn的中文(简体)网页。 共约有608项查询结果,这是第1-10项 。 搜索用时0.05秒。

示例:上著名IT门户网站ZDNET和CNET搜索一下关于搜索引擎技巧方面的资讯。
搜索:“"search engine" tips site:www.zdnet.com OR site:www.cnet.com”
结果:已在www.zdnet.com内搜索有关"search engine" tips OR site:www.cnet.com的网页。 共约有1,040项查询结果,这是第1-10项 。 搜索用时0.09秒。

注意,在这里Google有个小BUG。“已在www.zdnet.com内搜索…”,其实应该表述成“已在www.zdnet.com和www.cnet.com内搜索…”。

示例:搜索新浪科技频道中关于搜索引擎技巧的信息。
搜索:“搜索引擎 技巧 site:tech.sina.com.cn”
结果:已在tech.sina.com.cn搜索有关搜索引擎 技巧 的中文(简体)网页。 共约有163项查询结果,这是第1-10项 。 搜索用时0.07秒。

注意:site后的冒号为英文字符,而且,冒号后不能有空格,否则,“site:”将被作为一个搜索的关键字。此外,网站域名不能有“http://”前缀,也不能有任何“/”的目录后缀;网站频道则只局限于“频道名.域名”方式,而不能是“域名/频道名”方式。

8.2,在某一类文件中查找信息

“filetype:” 是Google开发的非常强大实用的一个搜索语法。也就是说,Google不仅能搜索一般的文字页面,还能对某些二进制文档进行检索。目前,Google 已经能检索微软的Office文档如.xls、.ppt、.doc,.rtf,WordPerfect文档,Lotus1-2-3文档,Adobe的. pdf文档,ShockWave的.swf文档(Flash动画)等。其中最实用的文档搜索是PDF搜索。PDF是ADOBE公司开发的电子文档格式,现 在已经成为互联网的电子化出版标准。目前Google检索的PDF文档大约有2500万左右,大约占所有索引的二进制文档数量的80%。PDF文档通常是 一些图文并茂的综合性文档,提供的资讯一般比较集中全面。

示例:搜索几个资产负债表的Office文档。
搜索:“资产负债表 filetype:doc OR filetype:xls OR filetypep:pt”
结果:已搜索有关资产负债表 filetype:doc OR filetype:xls OR filetypep:pt的中文(简体)网页。 共约有481项查询结果,这是第1-10项 。 搜索用时0.04秒。

注意,下载的Office文件可能含有宏病毒,谨慎操作。

示例:搜索一些关于搜索引擎知识和技巧方面的PDF文档
搜索:?quot;search engine" tips OR tutorial filetypep:df”
结果:已向英特网搜索"search engine" tips OR tutorial filetypep:df. 共约有12,600项查询结果,这是第1-10项 。 搜索用时0.22秒。

我们来看其中的一个结果:

[PDF]Search Engines Tips
文档类型: PDF/Adobe Acrobat – HTML 版
http://www.google.com/press/zeitgeist.html See what people are searching on at Google.com
* Search Engine Watch http://searchenginewatch.com/ Some free tips …
www.allvertical.com/PromoKits/SearchEngineTips.pdf – 类似网页

可以看到,Google用[PDF]来标记这是一个PDF的文档检索,另外,它还给出了该PDF文档的HTML版本,该HTML版保留了文档的文字内容和结构,但没有图片。

8.3,搜索的关键字包含在URL链接中

“inurl” 语法返回的网页链接中包含第一个关键字,后面的关键字则出现在链接中或者网页文档中。有很多网站把某一类具有相同属性的资源名称显示在目录名称或者网页名 称中,比如“MP3”、“GALLARY”等,于是,就可以用INURL语法找到这些相关资源链接,然后,用第二个关键词确定是否有某项具体资料。 INURL语法和基本搜索语法的最大区别在于,前者通常能提供非常精确的专题资料。 示例:查找MIDI曲“沧海一声笑”。
搜索:“inurl:midi “沧海一声笑””
结果:已搜索有关inurl:midi "沧海一声笑"的中文(简体)网页。 共约有27项查询结果,这是第1-10项 。 搜索用时0.34秒。

注意:“inurl:”后面不能有空格,Google也不对URL符号如“/”进行搜索。例如,Google会把“cgi-bin/phf”中的“/”当成空格处理。

“allinurl”语法返回的网页的链接中包含所有作用关键字。这个查询的关键字只集中于网页的链接字符串。

示例:查找可能具有PHF安全漏洞的公司网站。通常这些网站的CGI-BIN目录中含有PHF脚本程序(这个脚本是不安全的),表现在链接中就是“域名/cgi-bin/phf”。
搜索:“allinurl:"cgi-bin" phf +com”
结果:已向英特网搜索allinurl:"cgi-bin" phf +com. 共约有51项查询结果,这是第1-10项 。 搜索用时0.11秒。

8.4,搜索的关键字包含在网页标题中

“intitle” 和“allintitle”的用法类似于上面的inurl和allinurl,只是后者对URL进行查询,而前者对网页的标题栏进行查询。网页标题,就是 HTML标记语言title中之间的部分。网页设计的一个原则就是要把主页的关键内容用简洁的语言表示在网页标题中。因此,只查询标题栏,通常也可以找到 高相关率的专题页面。 示例:查找日本明星藤原纪香的照片集。
搜索:“intitle:藤原纪香 "写真集"”
结果:已搜索有关intitle:藤原纪香 "写真集"的中文(简体)网页。 共约有315项查询结果,这是第1-10项 。 搜索用时0.15秒。

8.5,搜索的关键字包含在网页的“锚”(anchor)链点内

所谓“锚”,就是在同一个网页中快速切换链接点。与URL和TITLE类似,Google提供了两种对anchor的检索,“inanchor”和“allincnchor”。对此不作详述。

9,其他罕用语法

9.1,搜索所有链接到某个URL地址的网页

如果你拥有一个个人网站,估计很想知道有多少人对你的网站作了链接。而“link”语法就能让你迅速达到这个目的。

示例:搜索所有含指向华军软件园“www.newhua.com”链接的网页。
搜索:“link:www.newhua.com”
结果:搜索有链接到www.newhua.com的网页 。 共约有920项查询结果,这是第1-10项 。 搜索用时0.12秒。

注意:“link”不能与其他语法相混合操作,所以“link:”后面即使有空格,也将被Google忽略。另外还要说明的是,link只列出Google索引链接很小一部分,而非全部,所以如果你用Google没有搜到链到你的主页的链接,也不必灰心丧气。

除 了上述功能,link语法还有其它妙用。一般说来,做友情链接的网站都有相似地方。这样,你可以通过这些友情链接,找到一大批具有相似内容的网站。比如 说,你是个天文爱好者,你发现某网站非常不错,那么,可以用link语法查一下与之做链接的网站,也许可以找到更多符合你兴趣的内容。

9.2,查找与某个页面结构内容相似的页面

“related” 用来搜索结构内容方面相似的网页。例:搜索所有与中文新浪网主页相似的页面(如网易首页,搜狐首页,中华网首页等),“related: wwwsina.com.cn/index.shtml”。我到现在也不明白这个语法有什么作用,如果有谁知 …

Posted in Web | Tagged | Leave a comment

Linux编程资料

一些比较有用的linux下编程资料和工具介绍,包括了编译器,调试器,等许多有用的东西


1.linux编程所用的一些工具

GCC 中文手册

http://www.nbfan.com/forum/dispbbs….&ID=1433&page=1

GNU make 指南

http://www.linuxsir.org/bbs/showthr…&threadid=40431

autoconf-2.57手册(英文)

http://www.gnu.org/software/autocon…toconf_toc.html

Autoconf-2.13手册

http://www.linuxforum.net/books/autoconf.html

使用 automake

http://263.aka.org.cn/Lectures/002/…-2.1.4/230.html

使用CVS进行版本管理

http://www.linuxforum.net/books/cvsintro.html

CVS用后感

http://www.linuxsir.org/bbs/showthread.php?t=170538

linux下常用调试工具:

非常好的gdb教程,强烈推荐:

http://www.linuxsir.org/bbs/showthread.php?t=171156

GDB英文文档

http://oldsite.linuxaid.com.cn/deve…howdev.jsp?i=49

gdb基本用法

http://www.linuxsir.com/bbs/showthr…&threadid=45731

gdb的官方文档

http://www.gnu.org/software/gdb/documentation/

linux编程基础:

要入门先看这个,Linux下C语言编程基础知识

http://www.linuxsir.com/bbs/showthr…=&threadid=1005

Linux 下 C 语言编程

http://www.linuxsir.org/bbs/showthr…=&threadid=7192

Linux下的C++编程

http://www.linuxsir.org/bbs/showthr…6723#post276723

linux下的应用程序开发

http://www.lisoleg.net/lisoleg/applications/index.html

参考书籍

Linux程序员指南(The Linux Programmer’s Guide)

http://www.linuxhq.com/guides/LPG/lpg.html

UNIX编程环境(The UNIX Programming Environment)

http://www.iu.hio.no/~mark/unix/unix_toc.html

UNIX编程的艺术(The Art of Unix Programming)

http://www.catb.org/~esr/writings/taoup/html/

进程与线程

Linux下的多进程编程初步

http://www.china-pub.com/computers/emook/0439/info.htm

多进程编程

http://www.linuxsir.org/bbs/showthr…&threadid=44083

Linux下的多进程编程

http://www.linuxsir.com/bbs/showthr…&threadid=48887

进程的创建

http://www.linuxsir.org/bbs/showthr…&threadid=44078

POSIX Threads Programming

http://www.llnl.gov/computing/tutor…reads/MAIN.html

linux系统调用

系统调用列表,编程必备

http://www-900.ibm.com/developerWor…/appendix.shtml

C语言库函数—unix常用系统调用—使用说明

http://www.linuxsir.org/bbs/showthr…threadid=119136
http://chinaunix.net/forum/viewtopic.php?t=72159

FAQ列表

UNIX Programming FAQ 中文版,很有参考价值

http://www.linuxforum.net/books/upfaq/book1.htm
UNIX Socket FAQ
http://www.developerweb.net/sock-faq/

编码规范

Linux内核编程风格

http://www.linuxsir.org/bbs/showthr…=&postid=257594

GNU编码标准

http://www.linuxforum.net/forum/sho…op&Number=29053

可执行文件格式与库文件

从程序员角度看ELF

http://www.linuxsir.com/bbs/showthr…&threadid=48381

ELF可执行联接规范(英汉对照版)

http://www.linuxaid.com.cn/articles…014528121.shtml

Linux动态链接库高级应用

http://www.linuxsir.com/bbs/showthr…&threadid=18889

链接器与加载器,非常重要的一本书(Linkers and Loaders )

http://www.iecc.com/linker/

终端与串口编程、设备文件

UNIX下c语言的图形编程–curses.h 函式库

http://www.fanqiang.com/a4/b2/20020626/060200258.html

VT100控制码

http://www.linuxsir.com/bbs/showthr…&threadid=43530

Linux ioctl() Primer

http://www.linuxsir.org/bbs/showthr…&threadid=44268

Linux Serial Programming How-to English version:

http://www.sgmltools.org/HOWTO/Seri…g-HOWTO/t1.html

Linux Serial Programming How-to 中文繁体版:

http://www.linux.org.tw/CLDP/OLD/Se…ming-HOWTO.html

linux中文化:

UTF-8 and Unicode FAQ

http://www.linuxforum.net/books/UTF-8-Unicode.html

unicode 如何转换为ASCII?

http://www.linuxforum.net/forum/gsh…=5&o=all&fpart=

一个台湾的linux中文化站点

http://xcin.linux.org.tw/i18n/

UTF-8 and Unicode FAQ for Unix/Linux

http://www.cl.cam.ac.uk/~mgk25/unicode.html

Linux Unicode 编程

http://www-900.ibm.com/developerWor…uni/index.shtml

Linux 国际化本地化和中文化

http://www.linuxforum.net/doc/i18n-new.html

一些很好的编程资源连接:

HPCVL编程资源连接

http://www.hpcvl.org/faqs/prog_links.html
Linux Programming Resources
http://leapster.org/linoleum/

Posted in GNU/Linux | Tagged | Leave a comment