69、UUCP 深入解析:守护进程、目录文件、配置与安全

UUCP 深入解析:守护进程、目录文件、配置与安全

1. uucpd 守护进程

uucpd 守护进程支持通过网络建立 UUCP 连接。它是后来开发引入的,最初 UUCP 基于非网络连接。随着网络通信成为计算机系统间常见的通信方式,UUCP 也必须进行适应。在某些平台(如 Solaris)上,该守护进程也被命名为 in.uucpd。

当通过对应的知名 UUCP 端口建立 UUCP 连接时,uucpd 由超级服务器 inetd 调用。对应的 inetd 配置项(以 HP - UX 10.20 为例)如下:

$ cat /etc/inetd.conf | grep uucp
uucp  stream tcp nowait root /usr/sbin/uucpd  uucpd

此配置项通常被注释掉,若要激活 uucpd 守护进程,需取消注释该行并重启 inetd 服务器。

对应的 UUCP 相关端口信息如下:

$ cat /etc/services | grep uucp
uucp  540/tcp uucpd  # uucp daemon

一旦被调用,uucpd 守护进程会提示登录,要求远程主机上启动连接的 uucico 进程提供用户名和密码。

2. UUCP 假脱机目录和文件

在讨论 UUCP 文件和目录时,很快会聚焦到 UUCP 假脱机目录。尽管 UUCP 配置文件位于 /etc/uucp 目录,相关程序位于 /usr/lib/uucp 目录,但要正确维护和管理 UUCP,理解假脱机目录至关重要。

假脱机目录的内容不断变化。除了在传输发生时会不断添加的日志文件外,在 UNIX 系统间的 UUCP 通信过程中,还会动态创建和删除大量工作文件。工作文件包含给 uucico 的指令,如要复制(传输)的文件名、所有权和权限、目标位置等。工作文件的命名格式如下:

C.dest_unameAjob_ID

其中:
- C :代表控制文件,用于与数据文件(D)区分。
- dest_uname :远程系统名称,截断为七个字符。
- A :表示文件处理顺序的字母(字母 A 到 Z、a 到 z,或根据 UUCP 版本的特定字母)。
- job_ID :六位作业标识号。

每个工作文件最多可包含 20 个针对给定系统的文件传输或执行请求。对于复制到假脱机目录的文件(使用 uucp -C 选项),相应的数据文件使用相同名称并加上前缀 “D”。当请求执行远程命令时,会创建前缀为 “X” 的执行文件;临时文件前缀为 “TM”,锁定文件前缀为 “LCK”,状态文件前缀为 “STST”。

BNU UUCP 的一项重大改进是引入了更有条理的假脱机目录:

/usr/spool/uucp/
.Admin           管理文件
.Corrupt         无法处理的损坏文件
.Log             日志文件
.Old             旧日志文件
.Sequence        系统序列号
.Status          系统状态文件
.Workspace       UUCP 临时工作区
.Xqtdir          远程执行
.files to/from specific systems
.system_name1
.system_name2
...
.system_name3

其中, /usr/spool/uucp/.Log/ 下又包含:
- uucp/ :uucp 请求日志目录。
- uucico/ :uucico 执行日志目录。
- uux/ :uux 请求日志目录。
- uuxqt/ :uuxqt 请求日志或本地系统上的远程命令执行目录。

UUCP 管理中最大的问题可能是清理假脱机目录,以清除已排队但未成功完成的作业。在大多数 UUCP 实现中,有自动 shell 脚本用于此清理操作,只需调整脚本运行的频率和 UUCP 工作文件的生命周期即可。

3. 配置 UUCP 链接

要正确配置 UUCP 链接,仅配置部分文件是不够的,还需完成以下几个步骤:
1. 建立通信链接 :在两个相关的 UNIX 主机之间建立通信链接,通常是基于调制解调器的拨出链接。
2. 命名系统 :为 UNIX 系统赋予唯一标识名称。
3. 创建系统文件条目 :在 Systems(或 L.sys)文件中创建条目,描述何时以及如何访问其他 UNIX 系统。
4. 创建设备文件条目 :在 Devices(或 L - devices)文件中创建条目,描述通信设备(硬件问题)。
5. 创建拨号指令 :为系统未知的调制解调器创建拨号指令。
6. 应用安全机制 :应用安全机制以保护系统。

部分系统提供菜单驱动的安装实用程序,使配置任务更轻松,但以下讨论假设从命令行进行管理。

3.1 串行线路相关问题

UUCP 网络的基础是物理通信链接,正确的通信链接是 UUCP 正常工作的基本要求。在链接建立之前,其他一切都无关紧要。

通信链接有三种类型:
1. 直接链接 :硬连线 RS - 232 链接。
2. 调制解调器链接 :通过电话线使用调制解调器。
3. 网络链接 :TCP/IP 网络。

当涉及直接或调制解调器通信链接时,它们都与系统的串行线路相关。从 UNIX 角度看,它们针对串行端口。UNIX 通过相应的特殊设备文件(特殊设备文件进一步指向内核中的相应驱动程序)来寻址串行端口。对于串行端口,这些是与终端相关的设备文件,指定为 /dev/ttynn(其中 nn 标识端口号)。

最初,串行端口用于连接系统的终端,为普通用户与系统提供通信。getty 程序会监控串行线路,一旦检测到线路上有活动,就会启动登录进程。然而,对于非 “登录相关” 的通信,getty 的行为可能成为障碍。实际上,getty 适合监控拨入线路,但对于拨出线路,应禁用 getty。

为实现不同的双向串行通信,有两种选择:
- 使用两个端口 :一个用于 “入”,另一个用于 “出”。
- 使用单个端口的两种方式 :UUCP 采用这种方式。BNU UUCP 提供了一个名为 uugetty 的双向程序(getty 程序的改进版本),可替代 getty。uugetty 足够智能,在线路用于拨出呼叫时不会响应 “登录提示”,而是继续进行适当的对话。

要在 System V 平台的系统启动期间启用 uugetty 程序,/etc/inittab 表应包含如下 UUCP 条目:

uu:2:respawn:/usr/lib/uucp/uugetty -r tty07 19200

其中:
- -r 选项告诉 uugetty 在显示登录提示之前等待读取一个字符。
- tty07 是假定的串行端口(终端线路)。
- 19200 是调制解调器的速度。

uugetty 是启用 UUCP 在相应串行线路上所需的双向通信的常见 getty 程序替代品,但并非必需。在 Solaris 2.x 上,常规的终端线路监控程序 ttymon 足够智能,能够处理与 UUCP 相关的双向通信,Solaris 2.x 甚至不提供 uugetty 程序。

3.2 UUCP 配置文件

一旦设置了串行链接,还必须提供许多其他配置和描述数据。这些数据定义了 UUCP 在系统上的行为,位于多个 UUCP 配置文件中。以下是两个不同平台的示例:

$ ls -C /etc/uucp            (HP - UX 10.20)
Devices
Dialers        Maxuuxqts        Poll
Dialcodes     Maxuuscheds    Permissions      Systems

$ ls -C /etc/uucp            (Solaris 2.x)
Config        Dialcodes      Limits           Sysfiles
Devconfig     Dialers        Permissions      Systems
Devices
Grades         Poll             remote.unknown
3.2.1 UUCP 系统数据

首先,应提供有关假定远程系统(主机)的适当配置数据:
- 远程系统名称
- 方便的呼叫时间
- 连接的远程调制解调器的电话号码
- 远程系统上的 UUCP 登录名
- 远程系统上的 UUCP 密码

这些数据对于 UUCP 通信的双方都很重要,且始终与对方的远程系统相关。

这些数据被放置在 UUCP 系统配置文件中,如 BNU UUCP 中的 Systems 文件或 Version 2 UUCP 中的 L.sys 文件。文件中的一个条目描述一个链接,与同一系统的多个链接用多个条目描述。条目的通用格式如下:

sys_name schedule device_type speed phone_number chat_script

其中:
|参数|描述|
|----|----|
|sys_name|远程系统的名称(可以使用 DNS 主机名)。|
|schedule|本地系统可以呼叫远程系统的时间安排:
- Any:系统可以在任何一天呼叫。
- Never:系统不应呼叫,只需等待被呼叫。
- Wk:任何工作日(也可以指定具体的工作日,如 Su、Mo、Tu、We、Th、Fr、Sa);时间子字段由两个 24 小时制的时间用破折号分隔,如 1900–2300 表示晚上 7 点到 11 点。|
|device_type|用于呼叫的设备类型:
- ACU:自动呼叫单元。
- ttynn:直接链接(ttynn 是 /dev 目录中的特殊设备文件名)。
- TCP:TCP/IP 连接(uucp 服务的端口在 /etc/services 文件中指定)。|
|speed|设备的速度,以 “bps” 为单位(某些系统也允许速度范围)。|
|phone_number|调制解调器用于呼叫远程系统的拨号序列。|
|chat_script|描述两个系统之间初始对话的字符串。|

chat_script 是条目在 phone_number 之后的剩余文本字符串,由期望 - 发送对组成,用空格分隔,可选的 “子期望 - 子发送” 对用连字符分隔。例如,期望和子期望字段明确指定系统期望从远程系统接收的内容,这就是为什么登录/密码期望字段指定为 ogin: 和 ssword: 的原因,这些词足以唯一标识登录/密码,并且涵盖了远程系统可能的 “Login:” 和 “Password:” 提示,甚至允许有额外的前导文本。此外,子发送字段 BREAK 可用于调整两个系统之间的调制解调器速度(当然,前提是设备支持)。

当 uucico 被调用时,它会扫描 UUCP 系统配置文件,查找要呼叫的系统名称以及有效的呼叫时间。如果到了呼叫时间,它会检查设备类型和速度字段以及其他与设备相关的配置数据。接下来,它会检查假脱机目录中该设备类型的锁定文件,如果存在锁定文件,则表示该设备类型已在使用中。然后,uucico 会检查是否有其他符合请求类型和速度的设备可供使用。如果没有可用设备,uucico 会返回 UUCP 系统配置文件,查看是否有同一系统的另一个配置条目。如果没有,则呼叫终止并推迟到以后。

以下是该过程的 mermaid 流程图:

graph TD;
    A[uucico 被调用] --> B[扫描系统配置文件];
    B --> C{是否到呼叫时间};
    C -- 是 --> D[检查设备类型和速度];
    D --> E[检查锁定文件];
    E -- 有锁定文件 --> F{是否有其他可用设备};
    F -- 是 --> D;
    F -- 否 --> G{是否有其他配置条目};
    G -- 是 --> B;
    G -- 否 --> H[呼叫终止并推迟];
    C -- 否 --> B;
    E -- 无锁定文件 --> I[进行呼叫];
3.2.2 UUCP 设备数据

UUCP 系统配置文件中每个条目的第三个字段给出了呼叫远程系统时要使用的设备类型名称。如果是直接链接,这是相应串行端口的特殊设备文件;否则,需要有关指定类型设备的额外信息。指定的设备类型实际上是指向另一个配置文件(BNU UUCP 中的 Devices 文件或 Version 2 UUCP 中的 L - devices 文件)中条目的指针。

  • BNU UUCP 的 Devices 文件 :包含直接链接、自动呼叫单元和网络连接的信息。文件语法规则严格,每个条目必须从第一列开始,否则将被忽略。每个条目包含五个字段,格式如下:
type  dataport  dialer_port  speed  dialer_token_pairs

其中:
|参数|描述|
|----|----|
|type|链接类型:
- Direct:用于计算机、调制解调器或 LAN 交换机的线路,供程序 cu(测试实用程序)使用。
- ACU:调制解调器连接。
- network:TCP/IP 连接。
- sys - name:与特定系统 sys - name 的直接链接。|
|dataport|用于建立连接的端口的设备名称。对于直接串行链接和调制解调器,这是 /dev 目录中对应于 UUCP 链接使用的串行端口的特殊文件名。|
|dialer_port|用于特殊类型 ACU 的可选字段,指定拨号器;否则忽略,该字段有一个虚拟值:“ - ”。|
|speed|调制解调器和直接链接设备的 “波特率”;也可以是 “Any”,以匹配 Systems 文件中请求的任何速度。|
|dialer_token_pairs|行的其余部分包含拨号器名称和令牌对(每对代表一个拨号器和要传递给在另一个文件 Dialcode 中定义的该拨号器的参数)。|

  • Version 2 UUCP 的 L - devices 文件 :每个连接到调制解调器或直接电缆到另一个系统的端口都应在该文件中描述。条目包含四个字段,格式如下:
type  device  call_unit  speed

其中:
|参数|描述|
|----|----|
|type|链接类型:
- DIR:直接链接。
- ACU:调制解调器连接。
- TCP:TCP/IP 连接。|
|device|/dev 目录中对应于 UUCP 链接使用的串行端口的特殊文件名。|
|call_unit|如果系统使用真正的 ACU,可以使用两个单独的设备进行呼叫:拨号器本身(称为 cua)和数据线(称为 cul);对于带有内置拨号器的智能调制解调器,该字段有一个虚拟值:“ - ” 或 “0”。|
|speed|调制解调器和直接链接的端口 “波特率”,或局域网连接使用的端口号。|

3.2.3 其他配置数据

UUCP 系统和设备配置文件始终存在,对 UUCP 配置至关重要。其他配置文件有时取决于 UUCP 版本和所使用的调制解调器,有时甚至是可选的。

以限制同时运行的 UUCP 守护进程最大数量为例,HP - UX 平台使用 Maxuuxqts 和 Muxuuscheds 文件分别指定相应 UUCP 守护进程的限制,而 Solaris 引入了一个名为 Limits 的单一文件来实现此目的。以下是该文件的内容:

$ cat /etc/uucp/Limits
#ident  "@(#)Limits  1.2 SMI"   /* from SVR4 bnu:Limits 1.1 */
#
#        Limits provides a means of specifying the maximum number of
#        simultaneous uucicos, uuxqts, and uuscheds that are permitted.
#        5 uucicos, 2 uuxqts, and 2 uuscheds are reasonable.
#
#        FORMAT:
#              service=<service name> max=<number>
#        where
#              <service name> is "uucico" or "uuxqt" or "uusched",
#              <number> is the limit that is permitted for that service.
#        The fields are order insensitive, case sensitive, and the first match in the file 
#
#        If the Limits file does not exist or it is unreadable or <number is> not a positive number,
#        then there will no overall limit for that service.
#
service=uucico max= 5
service=uuxqt max= 2
service=uusched max= 2

部分 UUCP 程序通过系统的 cron 工具定期激活。尽管 cron 是一个独立的 UNIX 工具,但需要强调 cron 和 UUCP 之间的依赖关系,正确的 UUCP 配置通常也需要正确的 cron 配置。UUCP 相关的 crontab 条目位于 /usr/spool/cron/crontabs/uucp 文件中。

4. UUCP 访问和安全考虑

UUCP 意味着对本地系统的远程访问,而远程访问总会引发系统安全问题。如果不加以保护,UUCP 系统可能允许任何远程用户复制文件进出本地系统,或在本地执行命令。这对入侵者来说是一个机会和挑战,对系统本身也十分危险。幸运的是,已经有很多安全措施到位,并且还有增加额外安全措施的可能性。

UUCP 在系统中表现为一个用户实体,每个系统上都存在一个与 UUCP 相关的用户账户 “uucp”,作为系统相关账户。和其他用户账户一样,UUCP 必须先登录系统,并通过完整的登录/密码验证过程。成功登录后,UUCP 不会获得常规的 shell,而是获得受限访问权限,并调用本地 uucico 程序的副本。此外,还有一些其他机制可用于提高本地站点的安全级别,具体如下:
1. 创建额外的 passwd 文件条目 :为不同的呼叫系统授予单独的访问权限。
2. 限制远程系统对本地文件的访问 :或者要求某些系统登录时进行回拨验证。
3. 控制远程执行的命令 :确保只有授权的命令可以在本地执行。
4. 控制文件的转发 :防止未经授权的文件在不同系统之间转发。
5. 分配适当的文件访问模式和所有权 :保护包含敏感数据的 UUCP 文件不被外部用户访问。

在大多数系统中, /etc/passwd 文件包含 “uucp” 条目,该条目指定了所需的管理数据(UUCP 用户和组 ID,并间接指定了所有 UUCP 目录和文件的所有权)以及登录后的工作环境(工作目录和启动的初始程序 uucico,而不是通常的 shell)。有些系统会为同一目的存在两个单独的用户条目。以下是一个提取的 “uucp” 用户条目示例:

$ cat /etc/passwd | grep uucp
uucp:x:5:3::/usr/spool/uucppublic:/usr/lib/uucp/uucico

从该条目中可以看出,UUCP 的工作目录是 /usr/spool/uucppublic ,启动的程序是 uucico。UUCP 密码条目是用户认证的常规部分,但该账户默认是关闭的,必须手动激活。

通常会提供多个 UUCP 账户,例如在 HP - UX 10.20 中:

$ cat /etc/passwd | grep uucp
uucp:*:5:3::/var/spool/uucppublic:/usr/lbin/uucp/uucico
nuucp:*:11:9::/var/spool/uucppublic:/usr/lbin/uucp/uucico

多个 UUCP 账户提供了更大的灵活性,可以根据不同的 UUCP 登录名,为不同的远程系统提供不同的系统访问权限。但在上述示例中,两个账户都处于关闭状态(注意密码字段中的星号,这表示 UUCP 在该系统上未激活)。

4.1 BNU UUCP 中的额外安全措施

BNU UUCP 基于登录 ID 提供了额外的保护,并通过引入名为 Permissions 的文件,对远程系统登录进行精细控制。此外,还有一个名为 remote.unknown 的文件,用于控制 “未知系统”(即未在 Systems 文件中列出的系统)是否可以登录。

Permissions 文件有两种类型的条目:
1. LOGNAME 条目 :为远程系统调用本地系统时使用的各个登录 ID 授予特定权限,也就是本地系统访问远程系统时的情况。
2. MACHINE 条目 :当本地系统调用远程系统时,为各个远程系统授予特定权限,即远程系统访问本地系统的情况。

为了实现全面的访问控制,管理员必须创建单独的登录 ID,并编写组合的 MACHINE 和 LOGNAME 条目。

Permissions 文件中的两种条目都由任意数量的 “选项/值” 对组成,格式为:

option=value    (no spaces around "=" sign)

可用的选项如下表所示,类代码 “M” 或 “L” 表示该选项是否可用于 MACHINE 或 LOGNAME 条目:
| 选项 | 类 | 描述 |
| ---- | ---- | ---- |
| LOGNAME | L | 指定远程系统使用的登录 ID |
| MACHINE | M | 指定本地系统可以呼叫的系统 |
| REQUEST | M, L | 指定远程系统是否可以请求从本地计算机设置文件传输(默认是 “no”) |
| SENDFILES | L | 指定被呼叫系统在会话期间是否可以执行本地排队的请求 |
| READ | M, L | 指定 uucico 可用于请求文件的目录(默认是 uucppublic) |
| WRITE | M, L | 指定 uucico 可用于存放文件的目录(默认是 uucppublic) |
| NOREAD | M, L | READ 选项或默认值的例外情况 |
| NOWRITE | M, L | WRITE 选项或默认值的例外情况 |
| CALLBACK | L | 指定在事务发生之前本地系统是否必须回拨(默认是 “no”) |
| COMMANDS | M | 远程系统可以在本地执行的命令(关键字 ALL 授予对所有命令的访问权限) |
| VALIDATE | L | 用于验证呼叫系统的身份 |
| MYNAME | M | 用于将另一个系统名称链接到本地系统 |
| PUBDIR | M,L | 指定本地访问的目录 |

Permissions 文件可能会让人感到困惑,下面通过三个任意 UUCP 系统(blue、red 和 black)的 Permissions 文件示例来解释其工作原理:

$ cat /etc/uucp/Permissions
#ident   "@(#)Permissions  1.6 SMI"  /* from SVR4 bnu:Permissions 2.2 */#
#
# per−machine and per−login permissions, e.g.,
# LOGNAME=Usun MACHINE=sun VALIDATE=sun COMMANDS=rmail \
# REQUEST=yes SENDFILES=yes
#
# See the System and Network Administration Manual for more information.
#
#         −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
#
# To configure the machine "blue":
# "red" logs in to "blue" as "Ured", and can request and send files regardless of who started
# the call. "red" can read and write to all directories on "blue" except the /blue/only directory,
# and can execute any command; other machines are not allowed.
#
# −− >  Uncomment following lines on the host "blue"
# LOGNAME=Ured MACHINE=red READ=/WRITE=/COMMANDS=ALL NOREAD=/# blue/only \
# SENDFILES=yes REQUEST=yes

以下是 BNU UUCP 安全配置的 mermaid 流程图:

graph TD;
    A[开始配置] --> B[创建登录 ID];
    B --> C[编写 LOGNAME 条目];
    B --> D[编写 MACHINE 条目];
    C --> E[设置选项/值对];
    D --> E;
    E --> F[保存到 Permissions 文件];
    F --> G{是否需要控制未知系统登录};
    G -- 是 --> H[配置 remote.unknown 文件];
    G -- 否 --> I[完成配置];
    H --> I;

总结

本文全面介绍了 UUCP(Unix - to - Unix Copy Program)的相关知识,包括 uucpd 守护进程、UUCP 假脱机目录和文件、UUCP 链接的配置以及 UUCP 访问和安全考虑等方面。

uucpd 守护进程支持通过网络建立 UUCP 连接,由 inetd 调用,调用后会提示登录并要求远程 uucico 进程提供用户名和密码。UUCP 假脱机目录是管理 UUCP 的关键,其内容不断变化,包含各种类型的文件,且 BNU UUCP 对其进行了更有条理的组织。

配置 UUCP 链接需要完成多个步骤,包括建立通信链接、命名系统、创建系统和设备文件条目、创建拨号指令以及应用安全机制等。同时,还涉及到串行线路相关问题和多个 UUCP 配置文件,如系统数据文件、设备数据文件和其他配置文件。

在安全方面,UUCP 存在远程访问带来的安全风险,但有多种安全措施可以提高系统的安全性,包括对 UUCP 用户账户的管理和 BNU UUCP 提供的额外安全机制,如 Permissions 文件和 remote.unknown 文件的配置。

通过深入理解和正确配置 UUCP 的各个方面,可以确保系统之间的文件传输和命令执行更加安全、高效。在实际应用中,需要根据具体的系统环境和需求,灵活运用这些知识,以达到最佳的使用效果。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值