42、Unix 安全脚本编写与手册页撰写指南

Unix 安全脚本编写与手册页撰写指南

1. 安全脚本编写基础

1.1 受限 shell

受限 shell 可禁用许多潜在危险操作,其环境应在用户的 .profile 文件中构建,在受限用户登录时执行。不过,实际中受限 shell 很难正确设置和使用。
具体操作时,要确保 $PATH 列出的任何目录中没有其他 shell,否则用户可运行该 shell 绕过限制。还要保证 $PATH 中没有允许用户启动 shell 的程序,如 ed ex vi 文本编辑器的 “shell 逃逸” 功能。

1.2 特洛伊木马

特洛伊木马是看似无害甚至有用,但包含隐藏危险的程序。
例如,用户 John Q. Programmer(登录名 jprog )是优秀程序员,其 ~jprog/bin 目录在 PATH 变量中排首位。他晋升系统管理员后,未更改 bin 目录的可写权限。恶意用户 W.M. Badguy 在该目录创建了名为 grep 的 shell 脚本:

/bin/grep "$@"
case $(whoami) in
    # Check effective user ID name
    root)
        # nasty stuff here
        rm ~/jprog/bin/grep
        ;;
esac

jprog 以普通用户身份工作时,此脚本无害。但当他使用 su 命令切换为 root 用户后,运行 grep 时实际执行的是该特洛伊木马脚本,它会在执行真正的 grep 后,以 root 权限执行恶意操作,且操作完成后会删除自身,不留痕迹。

为避免此类情况,应养成使用 su - user 切换用户的习惯,这样可防止继承现有 PATH

1.3 Setuid 脚本的风险

Unix 安全中的许多问题与 setuid (设置用户 ID)位有关。这是一个特殊权限位,当可执行文件开启该位时,文件将以文件所有者的有效用户 ID 运行。
例如,编写一个游戏程序,为保护私人得分文件,可将游戏设置为 setuid 到用户 ID,这样只有用户能更新该文件。但将程序设置为 setuid root 时会变得非常危险,因为这可能让攻击者以 root 权限执行命令。
设置文件的 setuid 位可使用 chmod u+s filename 命令。类似地,还有 setgid (设置组 ID),使用 chmod g+s filename 开启权限。
现代系统管理认为创建 setuid setgid shell 脚本是个糟糕的主意,因为很难弥补其安全漏洞。大多数现代 Unix 系统会禁用 shell 脚本的 setuid setgid 位,但部分系统(如 Mac OS X 和某些版本的 OpenBSD)可能是例外,需格外小心。

以下是一个利用 setuid 脚本漏洞的示例:

$ cd /tmp
$ ln /etc/setuid_script -i
$ PATH=.
$ -i

此操作会得到一个以脚本所有者的 setuid 运行的交互式 shell。不过,可通过将脚本首行改为 #!/bin/sh - 来修复此漏洞。

1.4 ksh93 与特权模式

Korn shell 的特权模式旨在防范 setuid shell 脚本。当执行 setuid 位开启的脚本时,shell 会自动进入特权模式,运行 /etc/suid_profile 文件。该文件应限制 setuid shell 脚本,至少应将 PATH 设置为只读,并指定为一个或多个 “安全” 目录。
可使用 set +o privileged (或 set +p )关闭特权模式,但此时 shell 会自动将有效用户 ID 改为与真实用户 ID 相同,即关闭 setuid 功能。
此外,ksh 提供了特殊的 “代理” 程序 /etc/suid_exec 来运行 setuid shell 脚本。脚本不应以 #!/bin/ksh 开头,当程序被调用时,ksh 会尝试将其作为普通二进制可执行文件运行,失败后会调用 /etc/suid_exec 并传递认证 “令牌”,由其验证并安排以正确的用户和组 ID 运行脚本。

虽然特权模式和 /etc/suid_exec 可避免许多针对 setuid 脚本的攻击,但编写可安全以 setuid 运行的脚本仍需丰富的知识和经验。

2. 手册页撰写

2.1 文档格式选择

在 Unix 中,简短的编程文档传统上以手册页形式提供,使用 nroff/troff 标记,可通过 man nroff -man groff -man 显示为简单 ASCII 文本,也可通过其他命令进行排版。
较长的软件文档通常以手册或技术报告形式提供,常用 troff 标记。不过, troff 标记不太友好,GNU 项目选择了 Texinfo 文档系统,它支持超文本链接,便于在线文档导航。
此外,还有 SGML、HTML 和 XML 等标记格式。Sun Microsystems 的 Solaris 7 几乎所有手册页都采用 SGML 格式,Linux 文档项目推广 XML 标记以方便翻译。
为实现最大的软件文档可移植性,最佳选择可能是 troff 或 Texinfo 标记。若要让 man 命令在各处都能工作,手册页格式必须是 troff 。还可使用 man2html man2texi 包将 troff 手册页自动转换为 HTML 和 Texinfo。

2.2 编写 pathfind 手册页

pathfind 脚本的手册页为例,介绍 troff 标记的使用。

2.2.1 基本结构

手册页从注释开始, troff 注释以反斜杠引号开头,到行尾结束。每个手册页文档以文本标题命令 .TH 开头,包含命令名、手册章节号、修订日期和版本号等参数,用于构建格式化输出文档的页眉和页脚。

.\" = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
.TH PATHFIND 1 "" "1.00"
2.2.2 各部分内容
  • NAME 部分 :为 apropos man -k 命令提供信息,格式为 命令 — 描述
.\" = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
.SH NAME
pathfind \(em find files in a directory path
  • SYNOPSIS 部分 :给出调用程序的命令行简要概要,包含字体信息和条件缩进命令。
.\" = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
.SH SYNOPSIS
.B pathfind
[
.B \-\^\-all
]
[
.B \-\^\-?
]
[
.B \-\^\-help
]
[
.B \-\^\-version
]
.if n .ti +9n
.\" .if t .ti +\w'\fBpathfind\fP\ 'u
envvar [ files-or-patterns ]
  • OPTIONS 部分 :描述程序的选项,包含选项说明和避免与选项混淆的注意事项。
.\" = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
.SH OPTIONS
.B pathfind
options can be prefixed with either one or two hyphens, and
can be abbreviated to any unique prefix.  Thus,
.BR \-v ,
.BR \-ver ,
and
.B \-\^\-version
are equivalent.
.PP
To avoid confusion with options, if a filename begins with a
hyphen, it must be disguised by a leading absolute or
relative directory path, e.g.,
.I /tmp/-foo
or
.IR ./-foo .
  • DESCRIPTION 部分 :对程序进行详细描述,包含程序功能、退出状态和示例。
.\" = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
.SH DESCRIPTION
.B pathfind
searches a colon-separated directory search path defined by
the value of the environment variable, \fIenvvar\fP, for
specified files or file patterns, reporting their full path on
.IR stdout ,
or complaining \fIfilename: not found\fP on
.I stderr
if a file cannot be found anywhere in the search path.
.PP
.BR pathfind 's
exit status is 0 on success, and otherwise is the number of
files that could not be found, possibly capped at the
exit code limit of 125.
.PP
For example,
.RS
.nf
\&\fCpathfind PATH ls\fP
.fi
.RE
reports
.RS
.nf
\&\fC/bin/ls\fP
.fi
.RE
on most Unix systems, and
.RS
.nf
\&\fCpathfind --all PATH gcc g++\fP
.fi
.RE
reports
.RS
.nf
\&\fC/usr/local/bin/gcc
/usr/bin/gcc
/usr/local/gnat/bin/gcc
/usr/local/bin/g++
/usr/bin/g++\fP
.fi
.RE
on some systems.
  • SEE ALSO 部分 :提供与其他相关命令的交叉引用。
.\" = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
.SH "SEE ALSO"
.BR find (1),
.BR locate (1),
.BR slocate (1),
.BR type (1),
.BR whence (1),
.BR where (1),
.BR whereis (1).

2.3 流程图

graph LR
    A[开始撰写手册页] --> B[选择文档格式]
    B --> C{格式类型}
    C --> |troff| D[使用troff标记撰写]
    C --> |Texinfo| E[使用Texinfo系统撰写]
    C --> |SGML/XML| F[使用SGML或XML标记撰写]
    D --> G[编写各部分内容]
    G --> H[NAME部分]
    G --> I[SYNOPSIS部分]
    G --> J[OPTIONS部分]
    G --> K[DESCRIPTION部分]
    G --> L[SEE ALSO部分]
    H --> M[完成手册页]
    I --> M
    J --> M
    K --> M
    L --> M

通过以上步骤,可编写安全的 shell 脚本并为程序撰写详细的手册页,提高系统安全性和程序的可维护性。

3. 安全脚本编写与手册页撰写要点总结

3.1 安全脚本编写要点

要点 说明
受限 shell 构建受限 shell 环境于 .profile 文件,确保 $PATH 无其他 shell 及可启动 shell 的程序,但实际设置和使用困难
特洛伊木马 注意可写的 bin 目录和 PATH 中的 . 可能引入特洛伊木马,使用 su - user 切换用户可防止继承现有 PATH
Setuid 脚本 现代 Unix 系统大多禁用 shell 脚本的 setuid setgid 位,编写 setuid 脚本风险大,需谨慎验证系统是否支持
ksh93 特权模式 可防范 setuid 脚本攻击,但编写安全的 setuid 脚本仍需丰富知识和经验

3.2 手册页撰写要点

要点 说明
文档格式选择 为实现最大可移植性,推荐 troff 或 Texinfo 标记,若使用 man 命令,手册页格式需为 troff ,可使用 man2html man2texi 进行转换
pathfind 手册页结构 包含 NAME SYNOPSIS OPTIONS DESCRIPTION SEE ALSO 等部分,各部分有特定格式和内容要求

3.3 操作步骤总结

3.3.1 安全脚本编写操作步骤
  1. 受限 shell 设置
    • 在用户的 .profile 文件中构建受限 shell 环境。
    • 检查 $PATH 目录,确保无其他 shell 和可启动 shell 的程序。
  2. 防范特洛伊木马
    • 避免 bin 目录可写,不将 . 置于 PATH 中。
    • 使用 su - user 切换用户。
  3. Setuid 脚本处理
    • 验证系统是否支持 shell 脚本的 setuid setgid 位。
    • 若编写 setuid 脚本,注意修复安全漏洞,如将脚本首行改为 #!/bin/sh -
  4. ksh93 特权模式使用
    • 确保 /etc/suid_profile 文件正确配置,限制 setuid shell 脚本。
    • 若关闭特权模式,注意有效用户 ID 的变化。
3.3.2 手册页撰写操作步骤
  1. 选择文档格式 :根据需求选择 troff 、Texinfo、SGML 或 XML 等标记格式。
  2. 编写 pathfind 手册页
    • 使用 troff 注释和 .TH 命令开始手册页。
    • 依次编写 NAME SYNOPSIS OPTIONS DESCRIPTION SEE ALSO 部分。
    • 注意各部分的格式和内容要求,如字体设置、缩进等。

3.4 流程图

graph LR
    A[安全脚本编写与手册页撰写] --> B[安全脚本编写]
    A --> C[手册页撰写]
    B --> B1[受限 shell 设置]
    B --> B2[防范特洛伊木马]
    B --> B3[Setuid 脚本处理]
    B --> B4[ksh93 特权模式使用]
    C --> C1[选择文档格式]
    C --> C2[编写pathfind手册页]
    C2 --> C21[编写各部分内容]
    C21 --> C211[NAME部分]
    C21 --> C212[SYNOPSIS部分]
    C21 --> C213[OPTIONS部分]
    C21 --> C214[DESCRIPTION部分]
    C21 --> C215[SEE ALSO部分]

4. 总结与建议

4.1 安全脚本编写总结

安全脚本编写是保障 Unix 系统安全的重要环节。受限 shell 虽有一定作用,但实际应用困难;特洛伊木马需通过合理的目录权限和用户切换方式防范;Setuid 脚本风险大,现代系统大多已禁用;ksh93 特权模式可提供一定防护,但编写安全脚本仍需专业知识。

建议在编写脚本时,充分考虑安全因素,定期检查系统是否存在安全隐患,如可写的 bin 目录和 setuid 脚本。

4.2 手册页撰写总结

手册页撰写是程序文档化的重要手段,选择合适的文档格式可提高文档的可移植性。 troff 标记虽复杂,但可通过简单的子集编写手册页,并可转换为 HTML 和 Texinfo 格式。

建议在编写手册页时,遵循规范的格式和内容要求,确保手册页的准确性和完整性,方便用户查阅和使用。

4.3 整体建议

  • 加强安全意识,在编写脚本和管理系统时,始终将安全放在首位。
  • 不断学习和更新知识,了解最新的安全漏洞和防范方法。
  • 注重文档编写,为程序提供详细的手册页,提高程序的可维护性和易用性。

通过以上方法,可有效提高 Unix 系统的安全性和程序的可管理性,为系统的稳定运行和程序的顺利使用提供保障。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值