网络编程客户端服务端代码_网络客户端管理

网络编程客户端服务端代码

在你开始前

了解这些教程可以教给您什么以及如何从中获得最大收益。

关于本系列

Linux Professional Institute (LPI)在两个级别上对Linux系统管理员进行认证: 初级 (也称为“认证级别1”)和中级 (也称为“认证级别2”)。 要获得1级认证,您必须通过101和102考试; 要达到2级认证,您必须通过201和202考试。

developerWorks提供了教程,以帮助您为四门考试中的每门考试做准备。 每个考试涵盖几个主题,并且每个主题在developerWorks上都有一个相应的自学教程。 对于LPI 202考试,这七个主题和相应的developerWorks教程为:

表1. LPI考试202:教程和主题
LPI考试202主题 developerWorks教程 教程总结
主题205 LPI 202考试准备(主题205):
网络配置
了解如何从硬件层(通常是以太网,调制解调器,ISDN或802.11)到网络地址的路由配置基本的TCP / IP网络。
主题206 LPI 202考试准备(主题206):
邮件和新闻
了解如何将Linux用作邮件服务器和新闻服务器。 了解有关NNTP协议的邮件传输,本地邮件筛选,邮件列表维护软件和服务器软件的信息。
主题207 LPI 202考试准备(主题207):
域名解析
了解如何主要使用BIND将Linux用作DNS服务器。 了解如何执行基本的BIND配置,管理DNS区域以及保护DNS服务器。
主题208 LPI 202考试准备(主题208):
网页服务
了解如何安装和配置Apache Web服务器,并了解如何实现Squid代理服务器。
主题210 LPI 202考试准备(主题210):
网络客户端管理
(本教程)了解如何配置DHCP服务器,NIS客户端和服务器,LDAP服务器以及PAM身份验证支持。 请参阅下面的详细目标
主题212 LPI 202考试准备(主题212):
系统安全
快来了
主题214 LPI 202考试准备(主题214):
网络故障排除
快来了

要开始准备1级认证,请参阅LPI 101考试developerWorks教程 。 要准备认证级别2的其他考试,请参阅LPI考试201developerWorks教程 。 阅读有关整个developerWorks LPI教程的更多信息。

Linux Professional Institute不特别认可任何第三方考试准备材料或技术。 有关详细信息,请联系info@lpi.org

关于本教程

欢迎来到“网络客户端管理”,这是涵盖Linux上的中间网络管理的七个教程的第5部分。 在本教程中,您将了解网络中客户端上网络设置的几种协议的集中配置,如何广泛地使用DHCP建立与客户端计算机的基本握手(例如分配IP地址)以及如何在更高级别上使用DHCP。级别,NIS和(通常是LDAP)用于网络上计算机之间的任意共享信息。 本教程还讨论了PAM(可插入身份验证模块),这是一种灵活的,联网的用户身份验证系统。

与developerWorks 201和202系列中的其他教程一样,本教程旨在作为学习指南和考试准备的切入点,而不是作为该主题的完整文档。 鼓励读者查阅LPI的详细目标清单,并根据需要用其他材料补充此处提供的信息。

本教程根据该主题的LPI目标进行组织。 粗略地说,对于体重较高的目标,应在考试中提出更多问题。

表2. Web服务:本教程涵盖的考试目标
LPI考试目标 客观体重 客观总结
2.210.1
DHCP配置
重量2 配置DHCP服务器。 此目标包括设置默认选项和每个客户端选项,添加静态主机和BOOTP主机。 还包括配置DHCP中继代理和维护DHCP服务器。
2.210.2
NIS配置
重量1 配置NIS服务器。 此目标包括将系统配置为NIS客户端。
2.210.3
LDAP配置
重量1 配置LDAP服务器。 此目标包括使用目录层次结构,组,主机,服务,以及向层次结构添加其他数据。 还包括导入和添加项目,以及添加和管理用户。
2.210.4
PAM验证
重量2 使用各种可用方法将PAM配置为支持身份验证。

先决条件

为了从本教程中获得最大收益,您应该已经具有Linux的基本知识和一个运行中的Linux系统,您可以在该系统上练习本教程中介绍的命令。

关于DHCP

动态主机配置协议(DHCP)是旧版BOOTP协议的后继产品。 DHCP服务器的主要作用是为可能与网络连接或断开连接的客户端计算机分配IP地址。 大多数IP网络,甚至具有稳定拓扑和客户端列表的IP网络,都使用DHCP来防止IP地址分配中的冲突。

此外,DHCP服务器还为客户端提供路由和子网信息,DNS地址以及某些情况下的其他信息。 DHCP分配的持续时间可能会有所不同,从短到无限,具体取决于服务器配置和客户端请求的详细信息。 实际上,DHCP与将固定IP地址(通过其MAC硬件地址)分配给特定计算机是一致的,但是在任何情况下都可以防止计算机之间发生冲突。

DHCP的正式规范是RFC 2131( 有关链接,请参阅本教程后面的参考资料)。

关于NIS

网络信息服务(NIS)是Sun Microsystems的“黄页”(YP)客户端-服务器目录服务协议,用于在计算机网络上分发系统配置数据,例如用户名和主机名。

NIS / YP用于在计算机网络中保留用户,主机名和大多数其他有用内容的中央目录。 例如,在常见的UNIX环境中,用户列表(用于身份验证)位于/ etc / passwd中。 使用NIS会添加另一个“全局”用户列表,该列表用于对任何主机上的用户进行身份验证。

在大多数情况下,NIS已被更通用,更安全的LDAP取代,以供通用。

有关NIS的更多信息的一个很好的起点是“ Linux NIS(YP)/ NYS / NIS + HOWTO”(请参阅参考资料中的链接)。

关于LDAP

轻型目录访问协议(LDAP)是用于访问目录服务(特别是基于X.500的目录服务)的客户端-服务器协议。

LDAP目录类似于数据库,但往往包含更具描述性的基于属性的信息。 这样,LDAP提供了足够的灵活性来存储任何类型的网络共享信息。 目录中的信息被读取的频率要比其写入的频率高得多,因此已对其进行了调整,可以对大量的查找或搜索操作做出快速响应。

LDAP具有广泛复制信息的能力,以提高可用性和可靠性,同时减少响应时间。 复制目录信息时,副本之间的任何临时不一致都会随着时间的推移而同步。

LDAP的正式规范是RFC 2251(请参阅相关主题中的链接)。

关于PAM

Linux-PAM(Linux的可插入身份验证模块)是一组共享库,使本地系统管理员可以选择应用程序对用户进行身份验证的方式。

支持PAM的应用程序可以在运行时在身份验证机制之间切换。 实际上,您可以完全升级本地身份验证系统,而无需重新编译应用程序本身。 使用系统文件/etc/pam.conf(或位于/etc/pam.d/中的一系列配置文件)在本地配置该PAM库,以通过本地可用的身份验证模块对用户请求进行身份验证。 模块本身通常将位于目录/ lib / security中,并采用可动态加载的目标文件的形式。

《 Linux-PAM系统管理员指南》是获取更多信息的良好起点(请参阅参考资料中的链接)。

其他资源

与大多数Linux工具一样,检查所讨论的任何实用程序的手册页总是很有用的。 版本和开关可能会在实用程序或内核版本之间或使用不同的Linux发行版进行更改。 有关更深入的信息,Linux文档项目提供了许多有用的文档,尤其是其HOWTO。 已经出版了许多有关Linux网络的书籍。 我发现Craig Hunt撰写的O'Reilly的TCP / IP网络管理非常有帮助。 (请参阅相关主题的链接。)

DHCP配置

整体协议

与许多网络协议一样,动态主机配置协议(DHCP)是客户端/服务器接口。 DHCP客户端在内部和配置上比DHCP服务器简单得多。 本质上,DHCP客户端的工作是在其本地物理子网上广播DHCPDISCOVER消息,然后等待响应。

DHCPDISCOVER消息可以包含建议网络地址和租用期限的值的选项。 收到DHCPDISCOVER消息的服务器应使用DHCPOFFER消息来响应请求的MAC地址。 客户端反过来以DHCPREQUEST消息响应提供服务器中的一个,通常响应第一个(也是唯一的)响应服务器。

客户端使用的实际配置参数在DHCPACK消息中接收。 此时,客户端已收到分配的IP地址,可以说,其通信将从数据链路层(以太网)移动到网络层(IP)。

客户程序

DHCP客户端通常仅需要配置其希望获取的信息集。 例如,基于Debian的发行版通常使用DHCP客户端dhclient,该客户端已通过/etc/dhcp3/dhclient.conf文件配置。 随dhcp3-client软件包一起分发的示例文件已注释掉除一个配置选项以外的所有文件。 一个启用的选项可能类似于:

清单1. dhclient.conf的选项
request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, host-name, netbios-name-servers, netbios-scope;

在此示例(默认配置)中,客户端实际上只是说“要求一切可能”。 在协商消息中,来自服务器的DHCPACK消息将包含所有这些请求的值的信息,客户端在接收到它们后将使用这些信息。 由于总是协商协商该配置,因此该列表中暗含了客户端IP地址。

除了指定超时和租用时间选项(以及其他一些选项)外,客户端可以 (但在大多数情况下不需要)对希望使用的IP地址进行一些限制。 要排除特定的reject 192.33.137.209; ,可以使用reject 192.33.137.209; 。 要指定客户希望使用的显式地址,请使用fixed-address 192.5.5.213;

客户端可能会拒绝带有DHCPDECLINE消息的租约,但是服务器将在可能的情况下尝试满足请求。 DHCP服务器还可以将特定的IP地址固定分配给发出请求的MAC地址。 服务器配置而不是客户端配置通常更容易配置每台计算机的IP地址。

为了跟踪获得的租赁,dhclient会在/var/lib/dh​​cp3/dhclient.leases文件中保存已分配的租赁列表(路径可能因发行版而异); 这样,如果系统与物理网络断开连接和/或重新引导,则未到期的DHCP租约不会丢失。

服务器进程

DHCP服务器需要更多地了解其选项,因为它以DHCP租约的形式向客户端提供各种信息,并且还必须确保为每个客户端唯一分配IP地址。 DHCP服务器通常以守护进程dhcpd的身份运行,并从/etc/dhcpd.conf中获取其配置信息(此路径可能在发行版中有所不同)。 单个dhcpd守护程序通常可以在多个物理网络连接到服务器时管理多个子网。 但是,最常见的是,一台服务器管理一个子网。 清单2是服务器配置的相当完整的示例。

清单2. dhcpd.conf配置选项
# default/max lease in seconds: day/week default-lease-time 86400; max-lease-time 604800; option subnet-mask 255.255.255.0; option broadcast-address 192.168.2.255; option routers 192.168.2.1; # DNS locally, fallback to outside local domain option domain-name-servers 192.168.2.1, 151.203.0.84; option domain-name "example.com"; # Set the subnet in which IP address are pooled subnet 192.168.2.0 netmask 255.255.255.0 { range 192.168.2.100 192.168.2.199; } # Assign a fixed IP to a couple machines by MAC address group { use-host-decl-names true; host first.example.com { hardware ethernet 00:00:c1:a2:de:10; fixed-address 192.168.2.200; } host second.example.com { hardware ethernet 00:dd:cc:a1:78:34; fixed-address 192.168.2.201; }

当客户端向运行此配置的服务器发送广播消息时,如果客户端具有指定的MAC地址,则它将在192.168.2.200或192.168.2.201上收到租约,或者将在IP地址中的可用地址上收到租约。池192.168.2.100至192.168.2.199。

客户端还可以使用DHCPINFORM消息来告知服务器它已经具有分配的IP地址(通过手动配置),但是希望获取其他配置信息。 请注意,告知服务器客户端使用一个特定的IP地址是不一样的请求特定的IP地址; 在后一种情况下,服务器可能会或可能不会根据现有租约授予请求。 在前一种情况下,服务器在决策中没有发言权,并且根本不授予租约(但是,服务器将尝试避免将已知正在使用的IP地址分配给新的请求客户端)。

当租约到期时,客户端和服务器必须协商新的租约,以使配置参数保持有效。 如果服务器上的配置信息可能会更改(例如,通过外部WAN使用动态DNS),则可以使用较短的租约。 客户端可以通过发送DHCPRELEASE消息来优雅地终止租约,但这不是正确操作所必需的(毕竟,客户端有时会崩溃,重新引导或断开连接,而没有机会发送此消息)。

如果没有发布消息,则服务器将在其授予的任何时间期限内保持租约,因此重新引导的计算机通常会继续使用其先前的租约(将存储在服务器和客户端上的dhclient.leases中)。

NIS配置

何时使用NIS

与NIS相关的大多数实用程序仍然使用yp前缀命名,因为它以前被称为“ Sun Yellow Pages”。 商标问题迫使名称更改为NIS。 NIS用于使机器网络共享诸如用户和组(分别为/ etc / passwd和/ etc / group的内容)之类的信息,从而在NIS域中的任何机器上授予用户权限。

NIS以类似于DNS的方式运行,以定义信息分布的域,并允许主服务器和从属服务器在域内分层分布信息。 实际上,原则上可以通过分发/ etc / hosts中的域名信息来代替DNS来使用NIS,但是实际上很少这样做。 NIS具有一定的灵活性,原则上可以将任何类型的信息放入NIS数据库(DBM格式,尽管NIS服务器软件包中的makedbm工具将平面文件转换为这种格式,通常“在幕后”)。 ”)。

还有一个名为NIS +的服务,旨在取代NIS,其中包括数据加密和身份验证; 但是,NIS +与NIS不向后兼容,因此没有得到广泛使用。

在你开始前

要运行任何NIS实用程序,您需要运行守护程序/ sbin / portmap,它将由于NIS客户端进行RPC调用而将RPC程序号转换为TCP / IP(或UDP / IP)协议端口号。 大多数Linux发行版都在其启动脚本中启动/ sbin / portmap,但是您应检查此守护程序是否正在以% ps -ax | grep portmap运行% ps -ax | grep portmap % ps -ax | grep portmap

如果尚未运行,请安装/ sbin / portmap并将其包含在系统启动脚本中。

NIS客户端实用程序(ypbind守护程序)

NIS客户端包括工具ypbindypwhichypcatyppollypmatch 。 守护程序ypbind必须以root身份运行,并且通常作为系统启动脚本的一部分启动(尽管不需要这样做)。

其他工具依赖ypbind的服务,但在用户级别运行。 ypbind的旧版本在本地网络上广播绑定请求,但这使恶意NIS服务器可以应答该请求并向客户端提供错误的用户和组信息。 最好为特定的服务器配置ypbind以使用/etc/yp.conf文件进行连接。 如果配置了多个服务器(或者尽管有危险仍在使用广播),则ypbind可能会每15分钟切换一次绑定的服务器,从而使响应速度最快。 这些各种服务器应以主/从配置进行排列,但是客户端不需要了解或关心该细节。 例如,ypbind配置可能如下所示:

清单3. /etc/yp.conf
ypserver 192.168.2.1 ypserver 192.168.2.2 ypserver 192.168.1.100 ypserver 192.168.2.200

在/ usr / sbin / ypbind运行之前,必须设置网络的NIS域名。 可以使用NIS服务器配置使用的任何名称,通常应选择与DNS域名不同的名称。 使用(代替实际名称)设置NIS域名: % ypdomainname my.nis.domain

NIS客户端实用程序(其他配置)

如果要使用NIS作为域名查找的一部分,则应修改/etc/host.conf以在查找顺序中包括NIS;否则,请执行以下操作: 例如,首先在/ etc / hosts中检查名称,然后在NIS中检查名称,然后在DNS中检查名称:

清单4.修改查找顺序
% cat /etc/host.conf order hosts,nis,bind

要启用NIS分布式用户,应修改客户机/ etc / passwd文件以使其包含+::::::

NIS数据库信息充当使用此“未填充”模式进行登录尝试的模板。 您可以根据需要微调用户信息,例如:

清单5.详细的/ etc / passwd
+user1::::::: +user2::::::: +user3::::::: +@sysadmins::::::: -ftp +:*::::::/etc/NoShell

这仅允许对user1user2user3以及sysadmin网络组的所有成员的登录访问,但是提供NIS数据库中所有其他用户的帐户数据。

NIS源本身在/etc/nsswitch.conf中配置。 该名称可能表明这严格用于名称服务器查找,但是描述了多种信息类型。 基本上,此配置描述了搜索信息源的顺序。 顺序中的名称nis表示从NIS服务器获得的信息。 名称files意味着使用适当的本地配置文件。 名称dns用于hosts选项。

同样,您可以指定如果初始源不包含所需信息时该怎么做: return表示放弃(并且除非NIS完全没有响应,否则continue表示尝试该数据的下一个源)。 例如:

清单6. /etc/nsswitch.conf
passwd: compat group: compat shadow: compat hosts: dns [!UNAVAIL=return] files networks: nis [NOTFOUND=return] files ethers: nis [NOTFOUND=continue] files protocols: nis [NOTFOUND=return] files rpc: nis [NOTFOUND=return] files services: nis [NOTFOUND=return] files

NIS客户端用户实用程序

在用户级别使用实用程序ypwhichypcatyppollypmatch来查询NIS信息:

  • ypwchich打印NIS服务器的名称。
  • ypcat打印NIS数据库中所有键的值。
  • yppoll打印NIS映射的版本和主服务器。
  • ypmatch从NIS映射中打印一个或多个键的值。

有关更多用法信息,请参见每个实用程序的相应手册页。

NIS服务器实用程序(ypinit,ypserv)

NIS服务器使用ypserv守护程序将NIS数据库提供给客户端,并使用/etc/ypserv.conf文件进行配置。 如前所述,您可以在域中同时运行主NIS服务器和从NIS服务器。 NIS数据库集在主服务器上使用(只是第一次运行;在此之后使用make -C /var/yp初始化,如下所示: % /usr/lib/yp/ypinit -m

从服务器实际上只是从主服务器获取其数据库(并运行ypserv)的NIS客户端。 要将主服务器信息复制到本地运行的从服务器,请使用% /usr/lib/yp/ypinit -s my.nist.domain

在主服务器上,NIS数据库是根据以下(一些)熟悉的配置文件中的信息构建的:

  • / etc / passwd,
  • / etc / group,
  • / etc / hosts,
  • / etc / networks,
  • / etc / services,
  • / etc / protocols,
  • / etc / netgroup,
  • / etc / rpc。

确切导出的数据库是在/ var / yp / Makefile中配置的,该文件在重建时也会传播更改。

从服务器将在NIS映射发生任何更改时(通过yppush程序)收到通知,并自动检索必要的更改以同步其数据库。 NIS客户端不需要执行此操作,因为它们不断与NIS服务器通信以读取存储在其DBM数据库中的信息。

LDAP配置

何时使用LDAP

原则上,轻型目录访问协议的目的类似于NIS。 两者都从客户端到服务器分发一些有关网络配置的结构化信息。 但是,LDAP在层次结构上将信息分发给哪些客户端,在必要时将请求重定向到其他LDAP服务器以及建立安全机制方面走得更远。 而且,LDAP为客户端提供了更新LDAP服务器中保存的信息的机制和工具,这些信息又将信息分发给其他请求该信息的客户端(当然要经过许可)。

安装

在运行OpenLDAP(Linux上通常使用的自由软件实现,尽管存在一些商业实现)之前,您将需要安装或验证几个必需库的存在:

  • 可以从OpenSSL项目 (或通过Linux发行版的安装机制)获得OpenSSL传输层安全性(TLS)服务。
  • 可选地支持Kerberos身份验证服务,但这是非常理想的。 MIT KerberosHeimdal Kerberos均可使用
  • 简单身份验证和安全层可以作为基本发行​​版的一部分安装,但也可以通过Cyrus SASL获得。
  • 建议使用Sleepycat软件Berkeley DB ,尽管其他DBM实现可能是兼容的。
  • 如果没有严格要求,则需要使用Posix线程和TCP包装器。

既然您已经满足了这些先决条件,请下载OpenLDAP库并执行或多或少的常规舞蹈:

清单7.常见的OpenLDAP安装舞蹈
% ./configure % make depend % make % make test # make sure things went OK % su root -c 'make install'

基本安装后,您需要配置slapd配置,通常在/usr/local/etc/openldap/slapd.conf中。 安装程序应包括您的域组件:

清单8. slapd.conf包含的域组件
database bdb suffix "dc=eng,dc=uni,dc=edu,dc=eu" rootdn "cn=Manager,dc=eng,dc=uni,dc=edu,dc=eu" rootpw <secret> directory /usr/local/var/openldap-data

为了找到<secret>的值, ,请使用实用程序slappasswd并将此加密的base64编码的字符串用于您的“ <secret> ”:

清单9.发现您的“秘密”
% slappasswd New password: ******* Re-enter new password: ******** {SSHA}YzPqL5Jio2+17NFIy/pAz8pqS5Ko13fH

要获取有关权限,复制和您可以在slapd.conf中配置的其他选项的更多信息,请仔细阅读详细的联机帮助页。

启动slapd守护程序几乎就像盯着任何守护程序一样。 您可以测试一下是否可以与ldapsearch一起ldapsearch

清单10.测试slapd是否有效
su root -c /usr/local/libexec/slapd ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts

如果一切顺利,您应该会看到类似以下内容:

清单11.正常响应
dn: namingContexts: dc=eng,dc=uni,dc=edu,dc=eu

使用LDIF文件添加数据

LDAP中使用的数据格式是二进制格式,但是称为LDAP数据交换格式(LDIF)的ASCII序列化用于将数据导出和导入LDAP数据库。 LDIF中的二进制数据表示为base64编码。 OpenLDAP包括用于将数据从LDAP服务器导出到LDIF( ldapsearch ),将数据从LDIF导入到LDAP服务器( ldapadd )以及将LDIF中描述的一组更改应用于LDAP服务器的工具( ldapmodifyldapdelete )。

此外,LDIF是用于Mozilla Application Suite和其他用户应用程序级工具的导入和导出地址簿数据的格式之一。 甚至Microsoft Windows 2000 Server和Windows Server 2003都包括LDIF工具LDIFDE ,用于与Active Directory进行数据传输。

要将信息手动添加到LDAP服务器,请首先创建LDIF文件:

清单12.创建示例LDIF文件example.ldif
dn: dc=example,dc=com objectclass: dcObject objectclass: organization o: Example Company dc: example dn: cn=Manager,dc=example,dc=com objectclass: organizationalRole cn: Manager

然后使用% ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f example.ldif

显然,您将example.com域替换为适合您站点的域。 通常,LDAP域层次结构和名称与熟悉的DNS名称所使用的层次结构和名称匹配。 您将需要输入在slapd.conf中指定的rootpw值。

查询LDAP数据库

有一个工具slurpd (独立LDAP更新复制守护程序),用于复制完整的信息数据库。 但是对于单个数据值,您将使用ldapsearch之类的工具,或者更可能在您运行的某些应用程序中内置LDAP支持。 slapcat工具也可用于将LDAP数据库转储到LDIF中。 例如,许多邮件用户代理(MUA)可以使用LDAP查找地址和联系信息。

在应用程序中,包括您可能使用应用程序或脚本语言编写的程序,都可以使用LDAP URL访问LDAP资源。 这些格式为ldap://host:port/dn?attributes?scope?filter?extensions

这些字段大多数都是可选的。 默认主机名是localhost;默认主机名是localhost。 默认端口是389。默认根专有名称是空字符串。 如果您需要身份验证信息,请在URL的扩展部分中指定它。

除了LDAP URL,许多LDAP服务器和客户端还支持非标准但使用广泛的LDAPS URL。 LDAPS URL使用SSL连接而不是纯文本连接,并使用默认端口636: ldaps://host:port/dn?attributes?scope?filter?extensions

PAM验证

何时使用PAM

关于可插拔身份验证模块(PAM),要记住的第一件事是它本身不是应用程序或协议。 而是,这是应用程序可能已被编译使用的库的集合。 如果应用程序启用了PAM,则系统管理员可以配置该应用程序的安全策略,而无需修改或升级应用程序本身。 许多Linux工具(尤其是守护程序和服务器)都支持PAM。

检查给定工具是否可能已启用PAM的快速方法是使用ldd检查其使用的库。 例如,我可能想知道我的登录实用程序是否启用了PAM:

清单13.我的登录PAM是否启用?
% ldd /bin/login | grep libpam libpam.so.0 => /lib/libpam.so.0 (0xb7fa8000) libpam_misc.so.0 => /lib/libpam_misc.so.0 (0xb7fa5000)

login使用libpam.solibpam_misc.so不能完全保证此工具实际上正在使用和正确使用PAM工具,但这是一个很好的建议。 同样,也许我也同样对我的Apache和FTP服务器感到疑惑:

清单14. Apache和FTP服务器如何?
% ldd /usr/sbin/apache2 | grep libpam % ldd /bin/login | grep libpam libpam.so.0 => /lib/libpam.so.0 (0xb7fa8000) libpam_misc.so.0 => /lib/libpam_misc.so.0 (0xb7fa5000)

因此,我知道我的特定Apache安装没有启用PAM(尽管包括该版本的可用版本)。

要更彻底地检查PAM是否可以完全使用给定的工具,可以为该程序创建PAM配置文件。 例如,要测试登录实用程序,您可以创建文件/etc/pam.d/login(但请注意,该文件可能已经在您的系统上以更有意义的设置存在,因此请不要删除现有副本):

清单15.使用etc / pam.d / login检查登录以获取PAM
auth required pam_permit.so auth required pam_warn.so

现在运行正常启用PAM的login都会让任何人登录,但它会记录动作到系统日志。 如果syslog显示条目,则为此应用程序启用了PAM。 读者会注意到,这是您可能会发明的用于login的最差配置,因为它使任何人都可以访问shell。 注意到这一点后,请注意在配置PAM时应特别谨慎。

PAM配置

PAM使用两种不同类型的配置文件。 大多数libpam.so库都是以“使用更好的(如果有的话),但选择更差的一种”的方式编译的。 但是,您可能还会将PAM库编译为“使用更好的库,但还要检查较差的库”。 让我解释一下。

当前配置PAM的首选方法是使用目录/etc/pam.d/中的文件,这些文件与它们描述其安全性的服务同名。 一种较旧且较不受欢迎的样式使用单个文件/etc/pam.conf来设置所有应用程序的安全策略。 从可维护性的角度来看,每个应用程序的配置文件更易于使用,并且还可以符号链接以从另一个应用程序“复制”安全策略。 两种配置样式看起来基本相同。 单个/etc/pam.conf文件包含以下格式的行:

清单16.两个配置文件都包含
<service> <module-type> <control-flag> <module-path> <args>

在每个应用程序配置文件中,第一个字段已被省略,因为它已经与文件名相同。 在较旧的样式中,我们看到的仅测试登录配置如下所示:

清单17. /etc/pam.conf
login auth required pam_permit.so login auth required pam_warn.so

<module-type> 字段可能具有四个值之一:

  • auth (身份验证),
  • account (基于用户状态系统的非身份验证权限),
  • session (在使用服务之前/之后执行操作),以及
  • password (更新用户身份验证令牌)。

<control-flag> 字段用于“堆叠”模块,该模块可让您对何时需要一种方法,是否完全执行该方法以及何时可以接受其他回退进行微妙的控制。 它的选项是

  • required
  • requisite
  • sufficient
  • optional
  • include

我将在下一小组中讨论这些内容。

<module-path> 我们已经在示例中看到了; 如果没有给出路径,它将在期望的模块位置命名共享库;如果以“ /”开头,则在显式位置命名共享库。 例如,在清单17中,您可能指定了/lib/security/pam_warn.so<args> 尽管大多数PAM模块都应支持一些通用参数,但根据特定模块配置其操作的需要,它可能是什么。 请注意,PAM模块是可扩展的。 如果有人编写了一个新的PAM模块,则只需将其放到/ lib / security中,一旦配置文件更新以表明这一点,您的所有应用程序都可以使用它。

PAM权限示例

看看<control-flag> 工作,让我们开发一个中等复杂的示例。 我们应该做的第一件事是创建特殊的OTHER服务。 如果存在,并且没有为服务定义PAM策略,则使用OTHER的策略。 一个安全的默认值可能类似于清单18:

清单18. /etc/pam.d/other
auth required pam_warn.so auth required pam_deny.so @include safe-account @include safe-password @include safe-session

在此示例中,身份验证尝试首先记录到syslog中,然后被拒绝。 @include语句仅包含来自其他地方的内容,例如/etc/pam.d/safe-account和friends,其中这些“安全”定义可能包含对其他<module-type>相似的warn-then-deny指令<module-type> 的。

现在,让我们为假设的分类数据库应用程序配置访问权限。 出于对访问的关注,用户要使用此应用程序,他或她需要提供匹配的视网膜打印或指纹,还需要输入密码。 但是,该密码可以存储在本地/ etc / passwd和/ etc / shadow配置中,也可以通过两个外部数据库服务器之一使用。

据我所知,在本示例中,我所使用的安全模块都不存在,除了pam_unix.so是老式的UNIX风格的密码访问。

清单19. /etc/pam.d/classified-db
auth optional pam_unix.so auth optional pam_database1.so try_first_pass auth optional pam_database2.so use_first_pass auth requisite pam_somepasswd.so auth sufficient pam_fingerprint.so master=file1 7points auth required pam_retinaprint.so

通过此配置的流程适度复杂。 首先,我们尝试通过三种optional模块类型进行密码认证。 由于这些是optional ,因此失败将不会停止身份验证过程也不会使其满意。 首先尝试使用标准的UNIX身份验证密码(提示用户输入密码)。 之后,我们检查database1密码,但首先使用通用模块参数try_first_pass来查看UNIX密码是否与数据库中的密码相同; 仅当不是时,我们才会提示您输入其他密码。 但是,对于database2 ,我们仅尝试使用用户输入的UNIX密码(通用参数use_first_pass )进行身份验证。

在检查了一些optional密码系统之后,我们使用了一个假设的pam_somepasswd.so ,它需要确定先前的密码检查是否成功(可能使用了信号灯;但是对于假设的模块,此操作pam_somepasswd.so完成)。 关键是,由于此检查是requisite ,因此如果失败,则不会进行进一步的身份验证并报告失败。

最后的两次身份验证检查(如果已达到)就sufficient 。 即,满足其中之一将使总体成功状态返回到调用应用程序。 因此,首先我们尝试使用pam_fingerprint.so进行指纹检查(注意,一些假设参数已传递给模块)。 仅当此操作失败时(可能是由于缺少指纹扫描仪以及指纹不好),才尝试进行视网膜扫描。 同样,如果视网膜扫描成功,那就sufficient 。 但是,仅为了演示所有标志,我们实际上在这里使用了required ,这意味着即使视网膜扫描成功,我们仍将继续检查其他方法(但在此示例中不存在, sufficient做同样的事情)。

还有一种方法可以为<control-flag>指定更精细的复合标志<control-flag> 使用带括号的[value1=action1 ...]设置,但是基本关键字通常就足够了。


翻译自: https://www.ibm.com/developerworks/linux/tutorials/l-lpic2210/index.html

网络编程客户端服务端代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值