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 安全脚本编写操作步骤
-
受限 shell 设置
-
在用户的
.profile文件中构建受限 shell 环境。 -
检查
$PATH目录,确保无其他 shell 和可启动 shell 的程序。
-
在用户的
-
防范特洛伊木马
-
避免
bin目录可写,不将.置于PATH中。 -
使用
su - user切换用户。
-
避免
-
Setuid 脚本处理
-
验证系统是否支持 shell 脚本的
setuid和setgid位。 -
若编写
setuid脚本,注意修复安全漏洞,如将脚本首行改为#!/bin/sh -。
-
验证系统是否支持 shell 脚本的
-
ksh93 特权模式使用
-
确保
/etc/suid_profile文件正确配置,限制setuidshell 脚本。 - 若关闭特权模式,注意有效用户 ID 的变化。
-
确保
3.3.2 手册页撰写操作步骤
-
选择文档格式
:根据需求选择
troff、Texinfo、SGML 或 XML 等标记格式。 -
编写
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 系统的安全性和程序的可管理性,为系统的稳定运行和程序的顺利使用提供保障。
超级会员免费看
7

被折叠的 条评论
为什么被折叠?



