详解Linux Bound模式及其使用方法 (linux bound模式)

Linux Bound模式(也称为seccomp)是Linux内核在2.6.12版本中引入的一种安全增强功能,它的主要作用是可以限制进程只能执行少量的系统调用,减小攻击面和提高应用的安全性。本文将详细讲解Linux Bound模式的原理、应用场景和使用方法。

一、Linux Bound模式的原理

Linux Bound模式是通过钩子函数来实现的,钩子函数是用于拦截系统调用的特殊函数,它可以在系统调用接口被攻击前进行审查和修改,从而达到防范恶意攻击的目的。当一个进程进入Linux Bound模式后,它只能执行指定的系统调用,所有未指定的调用将会被忽略而不是被执行。此外,Linux Bound模式还可以过滤一些危险的系统调用,如execve、fork、clone等,这些调用在恶意攻击中被广泛利用。

二、Linux Bound模式的应用场景

1. 容器

在容器技术中,Linux Bound模式非常常用,通过限制容器中进程的系统调用权限,可以保证容器中进程只能访问自己需要的资源和服务,而不能访问其他不必要的资源和服务,从而增加容器的安全性,防止容器被攻击和滥用。

2. Web服务器

Web服务器通常被用于托管web应用,它需要处理大量的请求,而且访问权限也比较敏感。如果Web服务器遭到攻击,攻击者可能会获得服务器的控制权,进而窃取网站的敏感信息或者对服务器进行滥用。因此,在Web服务器中使用Linux Bound模式是非常必要的,可以有效的减小攻击面,增加服务器的安全性。

三、Linux Bound模式的使用方法

Linux Bound模式可以通过两种方式来使用,一种是通过设置系统当前的行为模式,另一种是通过为进程设置行为模式。

设置系统的行为模式:

1. 将Linux Bound模式的默认行为模式设置为严格模式。

echo ‘2’ > /proc/sys/kernel/seccomp/actions_avlable

echo ‘2’ > /proc/sys/kernel/seccomp/actions_logged

echo ‘seccomp’ > /proc/self/status

2. 将Linux Bound模式的默认行为模式设置为过渡模式。

echo ‘1’ > /proc/sys/kernel/seccomp/actions_avlable

echo ‘1’ > /proc/sys/kernel/seccomp/actions_logged

echo ‘seccomp’ > /proc/self/status

为进程设置行为模式:

1. 使用libseccomp库

libseccomp是一个使用C语言编写的用户态库,可以方便地为进程设置行为模式。 使用步骤如下:

1) 创建一个seccomp过滤器

int filterid = -1;

scmp_filter_ctx ctx;

ctx = seccomp_init(SCMP_ACT_ALLOW);

2) 添加需要允许的系统调用

seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);

seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0);

3) 指定默认的行为

seccomp_attr_set(ctx, SCMP_FLTATR_CTL_NNP, 0);

4) 安装过滤器

filterid = seccomp_load(ctx);

seccomp_release(ctx);

2. 使用Docker

Docker是目前更流行的容器技术,它在实现容器隔离的同时,也支持设置Linux Bound模式。我们可以使用Docker的–security-opt参数来设置容器的行为模式,将它设置为seccomp严格模式即可。

docker run –security-opt seccomp=seccomp-strict image-name

Linux Bound模式是一种非常有效的安全增强功能,它可以减小进程的攻击面,提高应用的安全性。在容器、Web服务器等领域中,它的应用非常广泛。在使用Linux Bound模式的时候,一定要根据自己的需求和环境来选择合适的模式,并且保证配置的正确性和安全性。

相关问题拓展阅读:

如何在linux上配置ftp 及创建 ftp用户

请搜索你的LINUX 版本+你要用的FTP版本

网上从来不缺这样的教橡瞎轮程.

不梁信同的神则版本的LINUX 不同的FTP,具体操作过程不同.

在Internet上FTP(File Transfer Protocol,文件传输协议)扮 演着十分重要的角色。我们可以通过FTP与远程机器传输交换文件数 据,下载或上传最新的软件。基本的FTP服务器根据服务的对象神困可以分为两 种,一种是Unix(当然也包括Linux)系统基本的FTP服务器,使用者是服务器上合法的 用户;而另一种是匿名FTP服务器(Anonmous FTP Service),任何人只要使用anonmous或ftp帐号并提供电子邮件地址作为口令就可以使用FTP服务。

对于系统中合法的用户,其登录目录为他们的home目录;如果是匿名用户登录的话,登录后会到/home/ftp这个目录中,该除非我们在该目 录中存放下载文件,否则匿名FTP使用者将不能做任何事情。在本章,我们将详细地介绍FTP服务器的安装、配置以及服务 器的维护。

安装FTP服务器

在Linux的发行套件中都有FTP服务器的软件包wu-ftpd(Washington University FTP server),这是目前更流行的一种免费FTP服务器软件,目前绝大多数的FTP站点都是由wu-ftpd来架设的,而wu-ftp如此流行的原因是因 为它强大的功能,例如:

·可控制不同网域的机器对 FTP服务器的存取权限和访问时段。

·使用者在下载文件时,可自动对文件进 行压缩或解压缩工作。

·可以记录文件上传或下载的过程。

·可以限制更高访问人数,以维持系统的更佳运行效率。

·可显示相关的信息,以便用户了解当前的接收状态。

·可暂时关闭FTP服务器,以便系统维护。

在安装系统时如果选择了wu-ftpd软件包,就会自动安装。但如果我们想要使用最新的FTP软件包的话,可以到全世界各大FTP站点下载。目 前最新的版本是wu-ftpd-2.5.0,得到了wu-ftpd-2.5.0.tar.gz后,请按照我们下面的步骤进行安装。

1.将wu-ftpd-2.5.0.tar.gz复制到临时目录中并解压缩:

# tar zxvf wu-ftpd-2.5.0.tar.gz

进入解压缩产生的目录wu-ftpd-2.5.0中,在开始安装之前请仔细阅读里面的README、INSTALL等文件,以便了解安装需要注 意的事项。

2.执行命令“bulid lnx”,编译wu-ftpd-2.5.0的源程序。

# ./bulid lnx

这条命令将编译Linux系统使用wu-ftpd所需的服务程序,如果一切正常的话,将产生如下几个可执行文件:

ftpd FTP服务程序

ftpshut 关闭FTP服务的程序

ftpcount 显示FTP 服务器目前连接的人数的程序

ftpwho 查看目前使用者

3.执行安装命令“make install”,将编译生成的可执行文件和man pages安装到系统中。

# make install

4. 修改/etc/inetd.conf文件,加入如下一行:

ftp stream tcp nowait root /usr/in/tcpd in.ftpd -l –a

如果系统中以前安装有wu-ftpd的话,这一步可以略去不做,安装安装程序会自动更新/etc/inetd.conf文件有关ftp的记录 项。

5.如果想为FTP用户提供敏碧压缩解压缩的功能,我们还需要将tar、gzip、compress、cpio、sh等可执游拿念行文件复制到/home /ftp/bin目录下。此外,还需要将ls命令复制到/home/ftp/bin中,以便使用者查看目录。

因为我们复制到/home/ftp/bin目录下的程序有可能是动态链接的,所以它们运行时还需要共享函数库,我们要将他们运行时需要用到的共 享库复制到/home/frp/lib目录中。检查这些命令所需要的共享库可以使用“ldd”命令。例如对于“ls”命令,我们使用“ldd /usr/bin/ls”命令就可以得到如下的输出:

# ldd /usr/bin/ls

libc.so.6 = > /lib/libc.so.6 ( 0x)

/lib/ld-linux.so.2 = > /lib/ld-linux.so.2 ( 0x)

这样,我们就需要将/lib/libc.so.6和/lib/ld-linux.so.2复制到/home/ftp/lib目录中。其它命令所 需的共享库您也可以参照上面的方法找出并复制到/home/etc/lib目录中。

接下来复制/etc/passwd和/etc/group文件到/home/ftp/etc,并删除其中任何个人用户和个人用户组的信息。基本 上应该按照下面的例子修改:

#/home/ftp/etc/passwd文件

root:*:0:0:::

bin:*:1:1:::

operator:*:11:0:::

nobody:*:99:99:::

ftp:*:1000:1000:::

# /home/ftp/etc/group文件

root::0:

bin::1:

daemon::2:

sys::3:

adm::4:

ftp::1000:

6.为了确保提供FTP服务不会给我们的系统带来安全隐患,我们还需要采取以 下措施:

# chmod 0555 /home/ftp

# chmod 0111 /home/ftp/bin/*

# chmod 0555 /home/ftp/lib/*

# chmid 0444 /home/ftp/etc/*

配置FTP服务器

在安装好wu-ftpd之后,我们还需要定制FTP服务器,使之实现我们上一节中提到的各种功能。为了使我们的FTP服务器实现这些功能,我们 需要修改ftpusers、ftpaccess、ftpconversions、xferlog、ftpgroups、ftphosts等系统配置文件。 下面我们就来看一看这些文件的功能以及配置它们的方法。

各配置文件的功能

在开始配置FTP服务器的配置文件之前,我们先来简要地介绍一下各个文件的功能。在开包后的wu-ftpd-2.5.0目录中的 doc/examples目录下,我们可以找到以下这些文件的示例。

/etc/ftpaccess 一般情况下,我们最为重视的配置文件应该是“ftpaccess”,因为该文件决定着我们FTP服务器是否能够正常工作。此外,我们还可以在这个系统参数 文件中设置多项有关使用权限记录,以及与信息有关的文件名称及路径。

/etc/ftpusers 决定哪些人不可以执行ftp命令来传输文件,这些帐号通常是root、bin、news以及guest等有特殊用途的帐户。

/etc/ftpconversions 配置该文件可以实现用户在通过FTP传输文件的同时,对文件进行压缩打包等处理。

/etc/ftphosts 决定哪些网络中的主机或某些用户不能访问FTP服务器的文件。

/etc/ftpgroups 该文件不是决定哪些用户组不能够访问FTP服务器,它只有在使用SITE GROUP功能时才有用。

/var/log/xferlog FTP日志文件。该文件将记录使用匿名帐户的用户所上传或下载的过的文件,该文件只是记录FTP信息,我们不需要对它进行配置。

大致了解了各个设置文件的功能以后,我们就来为您介绍这些文件中的内容以及学习如何配置。

配置/etc/ftpaccess文件

我们前面介绍的wu-ftpd的大多数功能都是在ftpaccess文件中设置的。我们无须自己编写该文件,doc/examples /ftpaccess.heavy是一个稍微修改一下就能适用于大多数FTP服务器的例子,所以下面我们将以这个示例文件为例为您介绍ftpaccess 文件的配置。

# wu-ftpd-2.5.0的/etc/ftpaccess示例文件ftpaccess.heavy

#

# 设置用户登录FTP服务器时,允许输错密码的次数。

# loginfails 2表示允许用户输错两次密码,如果两次都输入

# 错误的话,FTP服务器打印“repeated login failures”的信息

# 并退出FTP会话过程。如不设置,则缺省值是5。

#

loginfails 2

#

# class是用来定义用户级别的命令,它的格式为

# class

# FTP服务器上有三种类型的使用者,分别是“real”——表示

# 在该FTP服务器上有合法帐号的用户;“guest”——表示另行

# 定义的某些使用组的使用者;“anonymous”——权限更低的匿名

# 用户。有了这三种使用者以后,在ftpaccess文件中就可以根据不

# 同的使用者设置不同的存取权限。但是,只有三种定义一般是不够

# 的,我们可以根据class的语法定义更多的控制命令。例如:

# class remote real,guest,anonymous *

# 这条class语句定义了remote中有三种不同的使用者,“*”表示网络

# 上所有的计算机,也就是说任何人都可以访问FTP服务器,一般的匿名

# FTP站点都应该有这一项。如果我们希望某台主机或网域中的机器具有

# 特殊的权限,那么我们可以设置如下的class:

# class local real,guest,anonymous localhost

# 这表示本地主机的类别被定义为local,当我们从主机连上FTP服务器上

# 时,就可以用较为特别的权限。

# 下面是ftpaccess.heavy文件指定的两个class,它们的意思是来自*.domain

# 和本地主机被归为local组,而其它的主机则是remote组。

#

class local real,guest,anonymous *.domain 0.0.0.0

class remote real,guest,anonymous *

#

# 我们可以使用limit命令设置某个时间段的FTP用户数量,如果超出了

# 规定的人数,则打印/etc/msgs/msgs.toomany文件并拒绝用户登录。例如:

# limit local 20 Any /etc/msgs/msgs.roomany

# 就是限制local这个组的机器同时间内最多允许20人连接FTP服务器,如果

# 超员,则打印/etc/msgs/msgs.toomany文件,显示当前在线人数太多。ftp的

# 说明文件都可以包含变量,在说明文件中可以使用“变量替换(magic

# sookies)”以指定的字符串代替某个变量:

# %T 本地时间

# %F CWD所在分区的剩余空间

# %C 当前工作目录

# %E 定义在ftpaccess文件中维护者的电子邮件地址

# %R 远端主机名称

# %L 本地主机名称

# %U 登录时所给的用户名称

# %M 该class允许的更大使用者数目

# %N 该class目前的使用者数目

#

# 我们可以利用这些变量编辑一个显示信息非常完善的说明文件。下面的

# 例子是设置当local用户在任何时候不能超过20人,remote用户在周六

# 周日的18:00到6:00不能超过100人,否则将显示/etc/msgs目录下的

# msg.toomany文件的内容。

#

limit local 20 Any /etc/msgs/msg.toomany

limit remote 100 SaSu|Any/etc/msgs/msg.toomany

limit remote 60 Any /etc/msgs/msg.toomany

#

# readme命令的作用是指定用户登录或进行其它操作(如更换目录)时

# FTP服务器提示用户阅读的文件。

#

readme README* login

readme README* cwd=*

#

# messages命令主要是设置一些FTP的显示信息,如下面的“message

# /welcome.msg login”就是代表用户登录时,将显示/home/ftp目录下的

# welcome.msg作为进站画面。我们要提醒您的是FTP服务器都是以

# /home/ftp这个目录作为根目录的,所以要写成/welcome.msg。而

# “message .message cwd=*”则是定义用户在更换目录时将显示在目录

# 下的文件。

#

message /welcome.msg login

message .message cwd=*

#

# 下面定义的允许从local和remote登录的机器在传输文件时,可执行compress

# 压缩文件或使用tar命令将多个文件打包成一个文件。

#

compress yes local remote

tar yes local remote

#

# 是否允许通过SITE GROUP和SITE GPASS命令适用秘密文件

# allow use of private file for SITE GROUP and SITE GPASS?

#

private yes

#

# 设置密码检查的规则。FTP服务器将要求匿名用户使用其电子邮件

# 地址作为密码,可是有人还是会胡乱输入,所以我们可以使用passwd-check

# 来查看用户是否输入一个类似于user@hostname的E- mail地址:none表

# 示不进行密码检查; trivial表示密码必须含有“@”;而使用rfc822时,

# 表示密码必须满足rfc822规定的地址。当密码不合要求时,warn将给予

# 警告,但依然允许他们登录,而enforce则表示警告并使用户退出。

#

# passwd-check

passwd-check rfc822 warn

#

# log commands 记录类型(可以是anonymous、

# guest和real)用户使用的命令。Log transfer

# 记录类型的用户做的(可以为inbound传进服务器、

# outbound传出服务器)方向的文件传输。

#

log commands real

log transfers anonymous,real inbound,outbound

#

# 如果shutdown指定的文件存在,FTP服务器将定期检查文件

# 以查看服务器是否预定关闭。文件的格式为:

#

# 和的意思是在服务器关闭前多长时间新的登录

# 请求和现存的连接将被拒绝和终止。是对拒绝连接的用户的一段信息。

# 如:

#:

# System shutdown at %s

# 表示1999年10月25日00:00关闭FTP服务器,10分钟以前拒绝连接,5分钟

# 以前中断正在连接的FTP服务。外部程序ftpshut可以用来产生文件,

# 例如上面的文件可以通过如下的命令来产生:

# ftpshut 0000

#

shutdown /etc/shutmsg

#

# 设置用户在FTP服务器上可以使用的命令,我们可以看到下面所有的

# 命令后面都是“no”,也就是说guest用户不能使用delete、overwrite、

# rename命令,而anonymous则都不能使用。只有real用户可以使用这些命令。

# all the following default to “yes” for everybody

#

delete no guest,anonymous # delete permission?

overwrite no guest,anonymous # overwrite permission?

rename no guest,anonymous # rename permission?

chmod no anonymous # chmod permission?

umask no anonymous # umask permission?

#

# 设置用户上传文件的目录。下面例子中/var/ftp目录下的/incoming目录可以

# 用来上传文件,上传文件的属主是root,组别是daemon,读取权限是0600,

# dirs表示在/incoming目录中可以创建子目录。

# specify the upload directory information

#

upload /var/ftp * no nobody nogroup 0000 nodirs

upload /var/ftp /bin no

upload /var/ftp /etc no

upload /var/ftp /incoming yes root daemon 0600 dirs

#

# 为/incoming目录设置路径别名为inc:,用户在任何时候只要使用命令

# “cd inc:”就可以到达/incoming目录。

# directory aliases…

#

alias inc: /incoming

# cdpath主要定义在改变目录时使用的搜索路径。如果我们定义:

# cdpath /incoming/test、cdpath /pub、cdpath /,那么用户在任意路径

# 随便cd到一个目录,比如cd test,那么将依次搜寻:

# /incoming/test

# /pub/test

# /test

# 以寻找一个符合test目录的路径。

#

cdpath /incoming

cdpath /pub

cdpath /

#

# path-filter的功能是检查用户上传文件的文件名是否合法,如下面

# 之一条命令就是指定所有的匿名用户上传文件的文件名只能是以

# A-Z、a-z、0-9以及“._-”组成,而不能以一个“.”或是一个“-”开始。

# 如果文件名不合法,将显示/etc/pathmsg给该用户。

#

path-filter anonymous /etc/pathmsg ^*$ ^. ^-

path-filter guest /etc/pathmsg ^*$ ^. ^-

#

# 设置guest用户

# specify which group of users will be treated as “guests”.

#

guestgroup ftponly

#

# FTP服务器管理员的邮件地址

#

email user@hostname

以上是一些ftpaccess常用的设置,您也可以参考ftpaccess的man pagse来获得更详细的配置信息。

配置/etc/ftpusers和/etc/ftphosts文件

通过ftpusers文件,我们可以限制系统中有哪些用户不能使用ftp服务,ftphosts文件与之类似,所不同的是该文件中记录的是不能 访问FTP服务器的主机。通常这样做的目的都是出于系统安全的考虑。Wu-ftpd 为我们准备有这两个文件的示例,我们可以在examples 目录中找到它们。下面是ftpusers文件设置的例子:

# 禁止使用FTP服务的用户

root

bin

boot

daemon

digital

field

gateway

guest

nobody

operator

ris

sccs

sys

uucp

限制这些用户使用FTP服务器主要是基于系统安全的考虑,避免权利过大的用户(如root、ftpadm)登录FTP服务器和避免使用系统命令作为 帐号(如shutdown、sync),以避免系统管理上的困惑。我们可以根据自己使用的需要,向该文件中增加或删除用户并将它复制到/etc目录中。

如果我们要架设的是匿名FTP服务器,那么通常不需要设置ftphosts文件,对于其它类型的FTP服务器可以参考 examples/ftphosts文件的格式结合自己的情况加以修改,然后复制到/etc目录中即可。下面是examples/ftphosts文件, 该文件允许网络somehost.domain中的用户ftp访问FTP服务器(somehost.domain可以是IP地址或域名)而禁止网络 otherhost.domain和网络131.211.32.*中的用户fred使用FTP服务。

#

# ftphosts文件配置示例,allow和deny的格式分别为:

# allow

# deny

#

# 以“#”开头的均为注释,空行将被忽略

#

allow ftp somehost.domain

deny fred otherhost.domain 131.211.32.*

配置/etc/ftpconversions文件

ftpconversions文件主要定义用户从FTP服务器中下载文件时对文件进行格式转换的规则。例如压缩、解压缩、打包和开包等操作,这 样用户就不必为.tar.gz、.tgz、.Z、.z之类的文件伤脑筋了。Ftpconversions文件的格式初看上去很复杂,不过不用担 心,/examples目录中也有该文件的例子,我们只要原封不动的将它复制到/etc目录中就能满足我们的使用需要了。下面让我们来看看 ftpconversions文件中各个记录项,有关各项的说明我们罗列在表14-1中:

#

# ftpconversions文件示例

#

#

:.Z: : :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS

: : :.Z:/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS

:.gz: : :/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP

: : :.gz:/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP

: : :.tar:/bin/tar -c -f – %s:T_REG|T_DIR:O_TAR:TAR

: : :.tar.Z:/bin/tar -c -Z -f – %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS

: : :.tar.gz:/bin/tar -c -z -f – %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP

: : :.crc:/bin/cksum %s:T_REG::CKSUM

: : :.md5:/bin/md5sum %s:T_REG::MD5SUM

表1 ftpconversions文件各项说明对照表

真实文件名

目标文件名

命令操作

.Z

传递前使用comprss –d命令压缩

.gz

传递前使用gzip –d命令压缩

.Z

传递前使用compress 命令压缩

.gz

传递前使用gzip –9命令压缩

.tar

传递前使用tar –cf命令打包

.tar.Z

传递前使用tar –cZf命令打包并压缩

tar.gz

传递前使用tar –czf命令打包并压缩

.tar.Z

传递前使用tar –cZf命令对目录打包并压缩

.tar.gz

传递前使用tar –czf命令对目录打包并压缩

Ftpconversions文件基本上把常用的压缩,打包命令都包括在内了,我们只要将它复制到/etc目录中,以后只要有人访问我们的 FTP服务器,FTP服务程序就会根据用户的需要执行压缩或打包的命令。例如,用户想下载目录Howto中所有的文件,那么他不必使用mget命令,而只 要使用get Howto.tar.gz,这时wu-ftpd就会将该目录打包压缩并发送到用户的机器上了。所以使用该文件可以完成压缩传递的数据量,减少传输时间等作 用。此外ftpconversions文件中定义的可执行文件的位置/bin指的都是/home/ftp/bin而不是Lnux /目录下的bin,所以请检查/home/ftp/bin目录中有无上述命令,如果没有还需要将这些程序复制到该目录中。

截止到这里,匿名FTP服务器的架设工作基本上就完成了,我们可以用ftp命令连接自己的服务器,检查合法用户和匿名用户的连接情况以及各个目 录的权限是否正确。之后就可以准备FTP服务的开张了。

查看全部更多资料去591cto

做一个虚拟账户就解决了:

步骤如下:

1、建立虚拟用户口令库文件

口令库文件中奇数行设置用户名,偶数行设置口令

# vi /etc/vsftpd/logins.txt 注意,一下是4行

upload 这个是帐户蔽旁名

upload 这个是密码

download

download

2、生成vsftpd的认证文件

# db_load -T -t hash -f logins.txt /etc/vsftpd/vsftpd_login.db

设置认证文件只对用户可读可写

# chmod 600 /etc/vsftpd/vsftpd_login.db

3、建立虚拟用户所需的PAM配置文件

# vi /etc/pam.d/vsftpd.vu

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

注意:以上2行中最后的2个文件名vsftpd_login和第2个步骤中的数据库名字必须一致!

4、建立虚拟用户所要访问的目录并设置相应权限

# mkdir /home/ftpsite

# useradd -d /home/ftpsite virtual(用户名)

# chown virtual:virtual /home/ftpsite

# chmod 700 /home/ftpsite/

5、设置vsftpd.conf配置文件

guest_enable=YES

guest_username=virtual

pam_service_name=vsftpd.vu

6、设置主配置文件

在vsftpd.conf文件中添加用户配置文件目录设置

user_config_dir=/etc/宏铅橡vsftpd_user_conf

# service vsftpd restart

7、建立用户配置文件目录

使用mkdir命令建立用户配置文件目录

# mkdir /etc/vsftpd_user_conf

为虚拟用户建立单独的配置文激埋件,用户配置文件名称与用户名相同

touch /etc/vsftpd_user_conf/upload

touch /etc/vsftpd_user_conf/download

8、每个FTP虚拟用户都可以独立设置其权限

vi /etc/vsftpd_user_conf/upload

anon_world_readable_only=NO 可读可下载

anon_upload_enable=YES 可上传

anon_mkdir_write_enable=YES 可创建和删除文件夹

anon_other_write_enable=YES 可文件改名和删除文件

local_root=/home/ftpsite/upload 指定upload的宿主目录

download_enable=NO 禁止下载

Linux下用C语言写一个FTP系统程序,基于客户/服务器模式

请问那你是需要客户端代码还是服务器端代码呢?

在绝大多数的LINUX发行版本中都选用的是WashingtonUniversity

FTP,它是一个著名的FTP服务器软件,一般简称为wu-ftp。它功能强大,能够很好地运行于众多的UNIX操作系统,例如:IBM

AIX、FreeBSD、HP-UX、NeXTstep、Dynix、SunOS、Solaris等。所以Internet上的FTP服务器,一大半以上采用了它。wu-ftp拥有许多强大的功能,很适于吞吐量较大的FTP服务器的管理要求:

 1) 可以在用户下载文件的同时对文件做自动的压缩或解压缩操作;

 2)

可以对不同网络上的机器做不同的存取限制;

 3) 可以记录文件上载和下载时间;

 4)

可以显示传输时的相关信息,方便用户及时了解目前的传输动态;

 5) 可以设置更大连接数,提高了效率,有效地控制了负载。

  & 2.2 所需资源

 

   &1.2.1

所需包

   RedHat6.2 服务器安装

   &1.2.2

所需配置文件

   /etc/ftpusers

   /etc/ftpaccess

   /var/run/ftp.pids

   /etc/ftpconversions

   /var/log/xferlog

   /etc/ftpgroups

   /etc/ftphosts

   &1.2.3 相关命令

ftpd FTP服务器程序

ftpshut 用于关闭FTP服务器程序

ftpcount 显示目前在线人数

ftpwho

查看目前FTP服务器的连接情况

ckconfig 检查FTP服务器的设置是否正确

ftprestart

重新启动FTP服务

   &1.2.4 相关目录

/home/ftpd/bin

存放一些供FTP用户使用的可执行文件

/home/ftpd/etc

存放一些供FTP用户使用的配置文件

/home/ftpd/pub 存放供下载的信息

/home/ftpd/incoming 存放闭伏供上载信息的空间

配置方案

  1.

/etc/ftpaccess

说明: ftp权限配置文件

源文件:

guestuser weboa

# FTP用户

class   all   real,guest,anonymous 

*

class   weboa guest *

# 格式:class

   功能:

   这个指令的功能设定FTP服务器上用户的类别。并可对客户端的IP地址进行限制,允许某部分的IP地址或全部的IP地址访问。而在FTP

   服务器上的用户基本上可以分为以下三类:

real 在该FTP服务器有合法帐号的用户;

guest 有记录的匿名用户;

   轿洞携   anonymous 权限更低的匿名用户

email

loginfails 5

# 格式:loginfails

功能:设定当用户登录到FTP服务器时,允许用户输错密码的次数。

readme  README*    login

readme  README*    cwd=*

message /welcome.msg

    login

message .message  cwd=*

#

格式:message

功能:当用户执行所指定的指令时,系统将指定的文件内容显示出来。

 颤基   compressyesall

# 格式:compress

功能:设置哪一个类别的用户可以使用compress(压缩)功能。

tar  

yesall

# 格式:tar

功能:设置哪一个类别的用户可以使用tar(归档)功能。

chmod      no     

guest,anonymous

# 格式:chmod

功能:

设置是否允许指定用户使用chmod命令更改文件权限。默认是

允许。

deleteyesall

# 格式:delete

功能:

设置是否允许指定用户使用delete命令删除文件。默认是允许。

overwrite yes    guest

#

格式:overwrite

功能:设置是否允许指定用户覆盖同名文件。默认是允许。

rename     yes    guest

# 

格式:rename

功能:设置是否允许指定用户使用rename命令来为文件改名。默认

     是允许。

log

transfers anonymous,real inbound,outbound

# 格式:log transfers

功能:

 设置哪些用户的上载(inbound)和下载(outbound)操作做日志。

shutdown

/etc/shutmsg

# 格式:shutdown

功能:

   FTP服务器关闭的时间可以设置在后面所指定的文件中,当设

  

置的时间一到,便无法登录FTP服务器了,要恢复的话只有将

   这个文件删掉。而这个文件必

须由指令/bin/ftpshut来生成。

passwd-check rfc822 warn

#

格式:passwd-check

功能:设定对匿名用户anonymous的密码使用方式。

   none 表示不做密码验证,任何密码都可以登录;

   trival 表示只要输入的密码中含有字符“@ ” “Times New Roman”‘>就可以登录;

   rfc822 表示密码一定要符合RFC822中所规定的E-Mail格式才

  

能登录;

   enfore 表示输入的密码不符合以上指定的格式就不让登录;

warn

表示密码不符合规定时只出现警告信息,仍然能够登录。

limit remote 32 Any

/etc/ftpd/toomany.msg

# 格式:limit

功能:这个指令的功能为设置指定的时间内指定的类别允许连接的

    

指定人数上限。当达到上限的时候,显示指定文件的内容。

upload /home/ftpd * no

upload /home/ftpd /pub yes anonymous 0644 dirs

# 格式:upload

功能:对可以上载的目录进行更加详细的设置。

alias incoming

/home/ftp/incoming

# 格式:alias

功能:给指定目录设置一个别名,在切换目录时就可以使用较短的

     目录别名。

  2.

/etc/ftpusers

说明:FTP用户黑名单,为了安全考虑,需要禁止以下用户使用FTP

源文件:

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

news

uucp

operator

games

nobody

  在众多的网络应用中,FTP(File Transfer

porotocol)有着非常重要的地位。在Internet中一个十分重要的资源就是软件资源。而各种各样的软件资源大多数都是放在FTP服务器中的。可以说,FTP与WEB服务几乎占据了整个Internet应用的80%以上。

  FTP服务可以根据服务对象的不同分为两类:一类是系统FTP服务器,它只允许系统上的合法用户使用;另一类是匿名FTP服务器,Anonymous

FTP Server,它使用任何人都可以登录到FTP服务器上去获取文件。

  如果你在安装LINUX系统的时候,在选择启动进程的时候选择了“ftpd”这一项的话,安装完LINUX系统后,它已经将一个默认的FTP服务器安装到系统中去了。我们已经可以利用它来实现系统FTP服务器的功能了。我们只需在此基础上根据我们的需要进行一些个性化设定就可以了。

研究生课题 linux内核怎么样

图2-1显示了基于x86计算机Linux系统的启动顺序。之一步是BIOS从启动设备中导入主引导记录(MBR),接下来MBR中的代码查看分区表并从活动分区读取GRUB、LILO或SYSLINUX等引导装入程序,之后引导装入程序会加载压缩后的内核映像并将控制权传递给它。内核取得控制权后,会将自身解压缩并投入运转。

基于x86的处理器有两种操作模式:实模式和保野桥数护模式。在实模式下,用户仅可以使用1 MB内存,并且没有任何保护。保护模式要复杂得多,用户可以使用更多的高级功能(如分页)。CPU 必须中途将实模式切换为保护模式。但是,这种切换是单向的,即不能从保护模式再切换回实模式。

内核初始化的之一步是执行实模式下的汇编代码,之后执行保护模式下init/main.c文件(上一章修改的源文件)中的 start_kernel()函数。start_kernel()函数首先会初始化CPU子系统,之后让内存和进程管理系统就位,接下来启动外部总线和 I/O设备,最后一步是激活初始化(init)程序,它是所有Linux进程的父进程。初始化进程执行启动必要的内核服务的用户空间脚本,并且最终派生控制台终端程序以及显示登录(login)提示。

图2-1 基于x86硬件上的Linux的启动过程

本节内的3级标题都是图2-2中的一条打印颂首信息,这些信息来源于基于x86的笔记本 电脑的Linux启动过程。如果在其他体系架构上启动内核,消息以及语义可能会有所不同。

2.1.1 BIOS-provided physical RAM map

内核会解析从BIOS中读取到的系统内存映射,并率先将以下信息打印出来:

BIOS-provided physical RAM map:

BIOS-e820:0009f000 (usable)

BIOS-e820:ff(reserved)

实模式下的初始化代码通过使用BIOS的int 0x15服务并执行0xe820号函数(即上面的BIOS-e820字符串)来获得系统的内存映射信息。内存映射信息中包含了预留的和可用的内存,内核将随后使用这些信息创建其可用的内存池。在附录B的B.1节,我们会对BIOS提供的内存映射问题进行更深入的讲解。

图2-2 内核启动信息

2.1.2 758MB LOWMEM available

896 MB以内的常规的可被寻址的内存区域被称作低端内存。内存分配函数kmalloc()就是从该区域分配内存的。高于896 MB的内存区域被称为高端内存,只有在采用特殊的方式进行映射后才能被访问。

在启动过程中,内核会计算并显示这些内存区内总的页数。

2.1.3 Kernel command line: ro root=/dev/hda1

Linux的引导装入程序通常会给内核传递一个命令行。命令行中的参数类似于传递给C程序中main()函数的argv列表,唯一的不同在于它们是传递给内核的。可以在引导装入程序的配置文件中增加命令行参数,当然,也可以在运行过程中修改引导装入程消辩序的提示行。如果使用的是GRUB 这个引导装入程序,由于发行版本的不同,其配置文件可能是/boot/grub/grub.conf或者是/boot/grub/menu.lst。如果使用的是LILO,配置文件为/etc/lilo.conf。下面给出了一个grub.conf文件的例子(增加了一些注释),看了紧接着title kernel 2.6.23的那行代码之后,你会明白前述打印信息的由来。

default 0 #Boot the 2.6.23 kernel by default

timeout 5 #5 second to alter boot order or parameters

title kernel 2.6.23 #Boot Option 1

#The boot image resides in the first partition of the first disk

#under the /boot/ directory and is named vmlinuz-2.6.23. ‘ro’

#indicates that the root partition should be mounted read-only.

kernel (hd0,0)/boot/vmlinuz-2.6.23 ro root=/dev/hda1

#Look under section “Freeing initrd memory:387k freed”

initrd (hd0,0)/boot/initrd

#…

命令行参数将影响启动过程中的代码执行路径。举一个例子,假设某命令行参数为bootmode,如果该参数被设置为1,意味着你希望在启动过程中打印一些调试信息并在启动结束时切换到runlevel的第3级(初始化进程的启动信息打印后就会了解runlevel的含义);如果bootmode 参数被设置为0,意味着你希望启动过程相对简洁,并且设置runlevel为2。既然已经熟悉了init/main.c文件,下面就在该文件中增加如下修改:

static unsigned int bootmode = 1 ;

static int __init

is_bootmode_setup( char * str)

{

get_option( & str, & bootmode);

return 1 ;

}

/* Handle parameter “bootmode=” */

__setup( ” bootmode= ” , is_bootmode_setup);

if (bootmode) {

/* Print verbose output */

/* … */

}

/* … */

/* If bootmode is 1, choose an init runlevel of 3, else

switch to a run level of 2 */

if (bootmode) {

argv_init = ” 3 ” ;

} else {

argv_init = ” 2 ” ;

}

/* … */

请重新编译内核并尝试运行新的修改。

2.1.4 Calibrating delay…1197.46 BogoMIPS (lpj=)

在启动过程中,内核会计算处理器在一个jiffy时间内运行一个内部的延迟循环的次数。jiffy的含义是系统定时器2个连续的节拍之间的间隔。正如所料,该计算必须被校准到所用CPU的处理速度。校准的结果被存储 在称为loops_per_jiffy的内核变量中。使用loops_per_jiffy的一种情况是某设备驱动程序希望进行小的微秒级别的延迟的时候。

为了理解延迟—循环校准代码,让我们看一下定义于init/calibrate.c文件中的calibrate_ delay()函数。该函数灵活地使用整型运算得到了浮点的精度。如下的代码片段(有一些注释)显示了该函数的开始部分,这部分用于得到一个 loops_per_jiffy的粗略值:

loops_per_jiffy = ( 1 >= 1 ; /* This fixes the most significant bit and is

the lower-bound of loops_per_jiffy */

上述代码首先假定loops_per_jiffy大于4096,这可以转化为处理器速度大约为每秒100万条指令,即1 MIPS。接下来,它等待jiffy被刷新(1个新的节拍的开始),并开始运行延迟循环__delay(loops_per_jiffy)。如果这个延迟循环持续了1个jiffy以上,将使用以前的loops_per_jiffy值(将当前值右移1位)修复当前loops_per_jiffy的更高位;否则,该函数继续通过左移loops_per_jiffy值来探测出其更高位。在内核计算出更高位后,它开始计算低位并微调其精度:

loopbit = loops_per_jiffy;

/* Gradually work on the lower-order bits */

while (lps_precision — && (loopbit >>= 1 )) {

loops_per_jiffy |= loopbit;

ticks = jiffies;

while (ticks == jiffies); /* Wait until the start of the next jiffy */

ticks = jiffies;

/* Delay */

__delay(loops_per_jiffy);

if (jiffies != ticks)/* longer than 1 tick */

loops_per_jiffy &= ~ loopbit;

}

上述代码计算出了延迟循环跨越jiffy边界时loops_per_jiffy的低位值。这个被校准的值可被用于获取BogoMIPS(其实它是一个并非科学的处理器速度指标)。可以使用BogoMIPS作为衡量处理器运行速度的相对尺度。在1.6G Hz 基于Pentium M的笔记本 电脑上,根据前述启动过程的打印信息,循环校准的结果是:loops_per_jiffy的值为。获得BogoMIPS的方式如下:

BogoMIPS = loops_per_jiffy * 1秒内的jiffy数 * 延迟循环消耗的指令数(以百万为单位)

= (* HZ * 2 ) / ()

= (* 250 * 2 ) / ()

= 1197.46 (与启动过程打印信息中的值一致)

在2.4节将更深入阐述jiffy、HZ和loops_per_jiffy。

2.1.5 Checking HLT instruction

由于Linux内核支持多种硬件平台,启动代码会检查体系架构相关的bug。其中一项工作就是验证停机(HLT)指令。

x86处理器的HLT指令会将CPU置入一种低功耗睡眠模式,直到下一次硬件中断发生之前维持不变。当内核想让CPU进入空闲状态时(查看 arch/x86/kernel/process_32.c文件中定义的cpu_idle()函数),它会使用HLT指令。对于有问题的CPU而言,命令行参数no-hlt可以禁止HLT指令。如果no-hlt被设置,在空闲的时候,内核会进行忙等待而不是通过HLT给CPU降温。

当init/main.c中的启动代码调用include/a-your-arch/bugs.h中定义的check_bugs()时,会打印上述信息。

2.1.6 NET: Registered protocol family 2

Linux套接字(socket)层是用户空间应用程序访问各种网络 协议的统一接口。每个协议通过include/linux/socket.h文件中定义的分配给它的独一无二的系列号注册。上述打印信息中的Family 2代表af_inet(互联网协议)。

启动过程中另一个常见的注册协议系列是AF_NETLINK(Family 16)。网络链接套接字提供了用户进程和内核通信 的方法。通过网络链接套接字可完成的功能还包括存取路由表和地址解析协议(ARP)表(include/linux/netlink.h文件给出了完整的用法列表)。对于此类任务而言,网络链接套接字比系统调用更合适,因为前者具有采用异步机制、更易于实现和可动态链接的优点。

内核中经常使能的另一个协议系列是AF_Unix或Unix-domain套接字。X Windows等程序使用它们在同一个系统上进行进程间通信。

2.1.7 Freeing initrd memory: 387k freed

initrd是一种由引导装入程序加载的常驻内存的虚拟磁盘映像。在内核启动后,会将其挂载为初始根文件系统,这个初始根文件系统中存放着挂载实际根文件系统磁盘分区时所依赖的可动态连接的模块。由于内核可运行于各种各样的存储控制器硬件平台上,把所有可能的磁盘驱动程序都直接放进基本的内核映像中并不可行。你所使用的系统的存储设备的驱动程序被打包放入了initrd中,在内核启动后、实际的根文件系统被挂载之前,这些驱动程序才被加载。使用 mkinitrd命令可以创建一个initrd映像。

2.6内核提供了一种称为initramfs的新功能,它在几个方面较initrd更为优秀。后者模拟了一个磁盘(因而被称为 initramdisk或initrd),会带来Linux块I/O子系统的开销(如缓冲);前者基本上如同一个被挂载的文件系统一样,由自身获取缓冲 (因此被称作initramfs)。

不同于initrd,基于页缓冲建立的initramfs如同页缓冲一样会动态地变大或缩小,从而减少了其内存消耗。另外,initrd要求你的内核映像包含initrd所使用的文件系统(例如,如果initrd为EXT2文件系统,内核必须包含EXT2驱动程序),然而initramfs不需要文件系统支持。再者,由于initramfs只是页缓冲之上的一小层,因此它的代码量很小。

用户可以将初始根文件系统打包为一个cpio压缩包,并通过initrd=命令行参数传递给内核。当然,也可以在内核配置过程中通过 INITRAMFS_SOURCE选项直接编译进内核。对于后一种方式而言,用户可以提供cpio压缩包的文件名或者包含initramfs的目录树。在启动过程中,内核会将文件解压缩为一个initramfs根文件系统,如果它找到了/init,它就会执行该顶层的程序。这种获取初始根文件系统的方法对于嵌入式系统而言特别有用,因为在嵌入式系统中系统资源非常宝贵。使用mkinitramfs可以创建一个initramfs映像,查看文档 Documentation/filesystems/ramfs- rootfs-initramfs.txt可获得更多信息。

在本例中,我们使用的是通过initrd=命令行参数向内核传递初始根文件系统cpio压缩包的方式。在将压缩包中的内容解压为根文件系统后,内核将释放该压缩包所占据的内存(本例中为387 KB)并打印上述信息。释放后的页面会被分发给内核中的其他部分以便被申请。

在嵌入式系统开发过程中,initrd和initramfs有时候也可被用作嵌入式设备上实际的根文件系统。

2.1.8 io scheduler anticipatory registered (default)

I/O调度器的主要目标是通过减少磁盘的定位次数来增加系统的吞吐率。在磁盘定位过程中,磁头需要从当前的位置移动到感兴趣的目标位置,这会带来一定的延迟。2.6内核提供了4种不同的I/O调度器:Deadline、Anticipatory、Complete Fair Queuing以及NOOP。从上述内核打印信息可以看出,本例将Anticipatory 设置为了默认的I/O调度器。

2.1.9 Setting up standard PCI resources

启动过程的下一阶段会初始化I/O总线和外围控制器。内核会通过遍历PCI总线来探测PCI硬件,接下来再初始化其他的I/O子系统。从图2-3中我们会看到SCSI子系统、USB控制器、视频 芯片(855北桥芯片组信息中的一部分)、串行端口(本例中为8250 UART)、PS/2键盘 和鼠标 、软驱 、ramdisk、loopback设备、IDE控制器(本例中为ICH4南桥芯片组中的一部分)、触控板、以太网控制器(本例中为e1000)以及PCMCIA控制器初始化的启动信息。图2-3中 符号指向的为I/O设备的标识(ID)。

图2-3 在启动过程中初始化总线和外围控制器

本书会以单独的章节讨论大部分上述驱动程序子系统,请注意如果驱动程序以模块的形式被动态链接到内核,其中的一些消息也许只有在内核启动后才会被显示。

2.1.10 EXT3-fs: mounted filesystem

EXT3文件系统已经成为Linux事实上的文件系统。EXT3在退役的EXT2文件系统基础上增添了日志层,该层可用于崩溃后文件系统的快速恢复。它的目标是不经由耗时的文件系统检查(fsck)操作即可获得一个一致的文件系统。EXT2仍然是新文件系统的工作引擎,但是EXT3层会在进行实际的磁盘改变之前记录文件交互的日志。EXT3向后兼容于EXT2,因此,你可以在你现存的EXT2文件系统上加上EXT3或者由EXT3返回到EXT2 文件系统。

EXT3会启动一个称为kjournald的内核辅助线程(在接下来的一章中将深入讨论内核线程)来完成日志功能。在EXT3投入运转以后,内核挂载根文件系统并做好“业务”上的准备:

EXT3-fs: mounted filesystem with ordered data mode

kjournald starting. Commit interval 5 seconds

VFS: Mounted root (ext3 filesystem).

2.1.11 INIT: version 2.85 booting

所有Linux进程的父进程init是内核完成启动序列后运行的第1个程序。在init/main.c的最后几行,内核会搜索一个不同的位置以定位到init:

if (ramdisk_execute_command) { /* Look for /init in initramfs */

run_init_process(ramdisk_execute_command);

}

if (execute_command) { /* You may override init and ask the kernel

to execute a custom program using the

“init=” kernel command-line argument. If

you do that, execute_command points to the

specified program */

run_init_process(execute_command);

}

/* Else search for init or sh in the usual places .. */

run_init_process( ” /in/init ” );

run_init_process( ” /etc/init ” );

run_init_process( ” /bin/init ” );

run_init_process( ” /bin/sh ” );

panic( ” No init found. Try passing init= option to kernel. ” );

init会接受/etc/inittab的指引。它首先执行/etc/rc.sysinit中的系统初始化脚本,该脚本的一项最重要的职责就是激活对换(swap)分区,这会导致如下启动信息被打印:

Addingk swap on /dev/hda6

让我们来仔细看看上述这段话的意思。Linux用户进程拥有3 GB的虚拟地址空间(见2.7节),构成“工作集”的页被保存在RAM中。但是,如果有太多程序需要内存资源,内核会释放一些被使用了的RAM页面并将其存储到称为对换空间(swap space)的磁盘分区中。根据经验法则,对换分区的大小应该是RAM的2倍。在本例中,对换空间位于/dev/hda6这个磁盘分区,其大小为KB。

接下来,init开始运行/etc/rc.d/rcX.d/目录中的脚本,其中X是inittab中定义的运行级别。runlevel是根据预期的工作模式所进入的执行状态。例如,多用户文本模式意味着runlevel为3,X Windows则意味着runlevel为5。因此,当你看到INIT: Entering runlevel 3这条信息的时候,init就已经开始执行/etc/rc.d/rc3.d/目录中的脚本了。这些脚本会启动动态设备命名子系统(第4章中将讨论 udev),并加载网络、音频、存储设备等驱动程序所对应的内核模块:

Starting udev:

Initializing hardware… network audio storage

最后,init发起虚拟控制台终端,你现在就可以登录了。

关于linux bound模式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 详解Linux Bound模式及其使用方法 (linux bound模式)