upload.configuration.HOWTO
上传用户:zibowangxu
上传日期:2007-01-04
资源大小:331k
文件大小:18k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1.  
  2.   Copyright (c) 1999 WU-FTPD Development Group.  
  3.   All rights reserved.
  4.   
  5.   Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994
  6.     The Regents of the University of California.
  7.   Portions Copyright (c) 1993, 1994 Washington University in Saint Louis.
  8.   Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc.
  9.   Portions Copyright (c) 1989 Massachusetts Institute of Technology.
  10.   Portions Copyright (c) 1998 Sendmail, Inc.
  11.   Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P.  Allman.
  12.   Portions Copyright (c) 1997 Stan Barber.
  13.   Portions Copyright (c) 1997 Kent Landfield.
  14.   Portions Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
  15.     Free Software Foundation, Inc.  
  16.  
  17.   Use and distribution of this software and its source code are governed 
  18.   by the terms and conditions of the WU-FTPD Software License ("LICENSE").
  19.  
  20.   If you did not receive a copy of the license, it may be obtained online
  21.   at http://www.wu-ftpd.org/license.html.
  22.  
  23.   $Id: upload.configuration.HOWTO,v 1.1 1999/09/20 02:02:17 wuftpd Exp $
  24.  
  25.                            Upload Configuration
  26.                                   HOW-TO
  27. This document is available on-line at:
  28.   ftp://ftp.wu-ftpd.org/pub/wu-ftpd/upload.configuration.HOWTO
  29. One of the more powerfull, yet most often misused, features of WU-FTPD is
  30. the upload clause.  Historically, the problems with the upload clause stem
  31. from unclear documentation and poor implementation.  This document is an
  32. attempt to address these issues.  The features discussed in this document
  33. apply to WU-FTPD Version 2.6.0.  If you are not running 2.6.0, you are
  34. strongly encouraged to upgrade; it includes a number of corrections, new
  35. features and security enhancements not available with earlier versions of
  36. WU-FTPD.
  37. Upload restrictions for anonymous FTP users
  38. -------------------------------------------
  39. For this example, we'll assume your system /etc/passwd file contains an
  40. entry for the anonymous FTP user as follows:
  41. ftp:*:95:95::/home/ftp:
  42. If your /etc/passwd file does not contain an entry for the user 'ftp' your
  43. site will not allow anonymous FTP.  In addition, if the usernames 'ftp' or
  44. 'anonymous' appear in the /etc/ftpusers file, anonymous FTP will not be
  45. allowed.
  46. In /etc/ftpaccess, we need a class which allows anonymous access.  The
  47. following allows anonymous FTP from anywhere:
  48. class anonftp anonymous *
  49. To prevent anonymous FTP users attempting a Denial of Service (DoS) attack
  50. against your system, you should create a special filesystem to receive
  51. their uploads.  This separate filesystem protects your server by limiting
  52. the total size of all uploaded files while preventing those files from
  53. consuming all available space on the server.  For this example, mount the
  54. filesystem on /home/ftp/incoming
  55. By default, the server will not allow uploads from anonymous FTP users.
  56. Just to be safe, and so we don't forget, let's add a clause saying that:
  57. upload /home/ftp * no
  58. What this says is, "For any user whose home directory is the anonymous FTP
  59. area, /home/ftp, do not allow any uploads."  As I said, this is the
  60. default, but put it in anyway so you don't forget.
  61. Now, we want to allow uploads into the incoming filesystem.  We MUST add a
  62. clause granting that privilege to anonymous users.  Right now we don't want
  63. to let anonymous users create directories.  (I recommend NEVER allowing them
  64. to do it, but I'll show you how in a bit.)  We want to ensure, however,
  65. the server is safe and cannot be used as a way-point for software pirates
  66. (warez traders).  So we'll set the directory permissions for the incoming
  67. area to prevent anyone seeing what's there and make the area write-only for
  68. anonymous users.
  69. First, we need an FTP site administrator, someone who owns the files, but
  70. isn't the root user or the anonymous user.  Something like the following
  71. /etc/passwd entry will do:
  72. ftpadmin:*:96:96::/home/ftp:
  73. Set the incoming area permissions and ownership to safe values.  I
  74. recommend the following:
  75. chown ftpadmin /home/ftp/incoming
  76. chgrp ftpadmin /home/ftp/incoming
  77. chmod 3773 /home/ftp/incoming
  78. Actually, ftpadmin should own more of the site, but I'm only talking about
  79. uploads right now.
  80. Finally, before we get into allowing uploads, one last thing.  Whether you
  81. allow on-the-fly tar'ing of directories or not, you should make sure an
  82. end-run cannot be made and the incoming area downloaded using tar.  To do
  83. so, create the special file '.notar' in both the FTP directory and the
  84. incoming area:
  85. touch /home/ftp/.notar
  86. chmod 0 /home/ftp/.notar
  87. touch /home/ftp/incoming/.notar
  88. chmod 0 /home/ftp/incoming/.notar
  89. The zero-length .notar file can confuse some web clients and FTP proxies,
  90. so let's mark it unretrievable.
  91. noretrieve .notar
  92. Time to allow uploads, put the following in /etc/ftpaccess:
  93. upload /home/ftp /incoming yes ftpadmin ftpadmin 0440 nodirs
  94. Notice the target directory for the uploads is relative to the view the
  95. user will have during the FTP session.
  96. What this says is, "For any user whose home directory is the anonymous FTP
  97. area, /home/ftp, allow uploads into the directory /incoming but do not
  98. allow the creation of new directories.  Make all files uploaded owned by
  99. the FTP administrator, mark them read-only so we don't allow them to be
  100. downloaded."  If uploaded files are to be made available for downloading,
  101. the safest thing to do is to tell the FTP administrator to move them into a
  102. public area and modify the permissions after validating and approving them.
  103. I know this seems draconian but, in the long run, it's best.
  104. Some FTP sites like to live dangerously and allow anonymous users to create
  105. directories.  I don't recommend this; it cannot be done with absolute
  106. safety.  If you insist, however, you can at least limit it to a single
  107. directory level.  For example, replace the upload clause just added with
  108. the following:
  109. upload /home/ftp /incoming   yes ftpadmin ftpadmin 0440 dirs 3773
  110. upload /home/ftp /incoming/* yes ftpadmin ftpadmin 0440 nodirs
  111. The first line allows directories to be created in the incoming area and
  112. enforces the use of safe permissions on them.  The second prevents creation
  113. of deeper sub-directories.  Notice one of the problems with allowing
  114. directory creation is there is no way to automatically create a '.notar' in
  115. the new directory, so a crafty user may be able to make an end-run and
  116. download it anyway using on-the-fly tar'ing.
  117. One last thing: since the incoming area shouldn't allow downloads, and
  118. since it's a file system, there will be a lost+found area; you will want to
  119. add the following clause to make SURE no downloads occur:
  120. noretrieve /home/ftp/incoming
  121. or, at least, add the following to prevent downloading of the lost+found
  122. files:
  123. noretrieve /home/ftp/incoming/lost+found
  124. Upload restrictions for guest users
  125. -----------------------------------
  126. Setting up the FTP server for guest users is covered in the Guest HOWTO.
  127. It is not my purpose here to cover how to set up for guest access.  If you
  128. have not yet done so, review the information in that document at:
  129.   ftp://ftp.fni.com/pub/wu-ftpd/guest-howto
  130. For this example, I'll assume you have entries similar to the following in
  131. your system /etc/passwd file:
  132. dick:*:1010:1010::/home/users/./dick:/bin/sh
  133. jane:*:1011:1011::/home/users/./jane:/bin/sh
  134. By default, the WU-FTPD server will grant upload privileges to all guest
  135. users.  The example users are chroot'd to /home/users and cannot access any
  136. area of the filesystem outside that directory structure.  What we're
  137. interested in, then, is simply protecting the areas in the chroot directory
  138. structure we want to keep the users out of.
  139. In a minimal installation, there will be bin, etc and dev, subdirectories
  140. in the /home/users directory.  Other files and subdirectories may exist
  141. depending upon the requirements of your operating system.  We don't want
  142. users being able to upload into these areas.  In case something happens to
  143. the permissions on them (you did set the permissions to safe values, didn't
  144. you?), you should deny upload privileges in your ftpaccess file.  In our
  145. case, we'll say the following:
  146. upload /home/users/* /    no
  147. upload /home/users/* /bin no
  148. upload /home/users/* /etc no
  149. upload /home/users/* /dev no
  150. While we're at it, we'll prevent downloads with noretrieve.  Don't forget
  151. to prevent end-runs by also creating .notar files in each directory.
  152. noretrieve /home/users/bin
  153. noretrieve /home/users/etc
  154. noretrieve /home/users/dev
  155. Upload restrictions for real users
  156. ----------------------------------
  157. First off, let me say you shouldn't have any real users in your FTP site.
  158. Or, being more realistic, the only real user should be the site
  159. administrator.  That being said, real users should be restricted to
  160. uploading only into specific areas.  Let's start with a real user in
  161. /etc/passwd:
  162. ftpadmin:*:109:109::/home/users/ftpadmin:/bin/sh
  163. Again, by default, the server will grant upload privileges everywhere, so
  164. we have to start by revoking them and only allowing what we want to:
  165. upload /home/users/ftpadmin *                      no
  166. upload /home/users/ftpadmin /tmp                   yes nodirs
  167. upload /home/users/ftpadmin /home/users/ftpadmin   yes
  168. upload /home/users/ftpadmin /home/users/ftpadmin/* yes
  169. upload /home/users/ftpadmin /home/ftp/incoming     yes ftpadmin ftpadmin 0440 nodirs
  170. About matching rules
  171. --------------------
  172. Use extreme care when forming wildcard matching rules.  It may be tempting
  173. to say, for instance:
  174. upload /home/users/ftpadmin /home/users/ftpadmin* yes
  175. But, if you do, there will be unintended consequences.  In the example,
  176. we're trying to restrict upload privileges to just the ftpadmin's home
  177. directory.  Consider, though, this will match all of the following
  178. directories:
  179. /home/users/ftpadmin
  180. /home/users/ftpadmin/mirrors
  181. /home/users/ftpadministration
  182. This last directory isn't wanted.  Instead use:
  183. upload /home/users/ftpadmin /home/users/ftpadmin   yes
  184. to match the ftpadmin's home directory itself, then use:
  185. upload /home/users/ftpadmin /home/users/ftpadmin/* yes
  186. to match all subdirectories under the ftpadmin's home.
  187. umasks for guest and real users
  188. -------------------------------
  189. In most cases you will want to allow guest and real users to control the
  190. permissions on their own files and directories.  As in the examples shown,
  191. if there are no specific permissions given on upload clauses, any new files
  192. or directories created will have all permissions set.  umasks can be used
  193. to reduce these permissions.
  194. The daemon has a command-line option (-u) to set the default umask for all
  195. users.  Follow the -u option with an octal permissions mask.  Bits in this
  196. mask are permissions to turn off whenever the daemon creates a new file or
  197. directory.  The manpage for ftpd documents the -u option.
  198. Often times, the global -u option is not sufficient.  In the ftpaccess
  199. file, you can control umasks by class by using the defumask clause.  If no
  200. class is given, defumask overrides the -u umask from the command line.  If
  201. the current user is a member of the named class, defumask overrides the
  202. umask setting for this user only.
  203. For example, assume there are several classes of users
  204. class admin  real       10.0.0.0/8 127.0.0.0/8
  205. class local  guest      10.0.0.0/8 127.0.0.0/8
  206. class remote guest      *
  207. class anon   anonymous  *
  208. ( Notice, by the way, in this example, real users will not be allowed
  209. access unless from the local network since they are not in any class when
  210. coming from an outside IP address.  Since the daemon gives no clue to the
  211. remote user in this case, to outside addresses it will appear as if the
  212. admin users do not exist on the server.  The specific cause for their login
  213. failure will appear in your system logs. )
  214. We can control the umask by class for these users.  For example, we might
  215. say:
  216. defumask 0377
  217. defumask 0177 admin
  218. defumask 0133 local remote
  219. The first clause applies whenever another defumask clause does not match
  220. the current user's class.  This is the same as adding '-u 0377' to the
  221. command line for the FTP daemon.  In this case, the clause applies only to
  222. anonymous users since all other classes have specific default umasks given.
  223. The second turns off execute permissions, as well as group- and world- read
  224. and write permissions, for all files and directories created by real users
  225. (users in the admin class).
  226. The last rule turns off execute permissions and group- and world-write
  227. permissions for files and directories created by guests (in the local and
  228. remote classes).
  229. Remember: umasks apply to ALL files and directories created EXCEPT those
  230. where an upload clause applies AND the upload clause gives specific
  231. permissions.  Disabling execute permissions will cause problems using newly
  232. created directories; leaving them enabled is unsafe because all files
  233. uploaded will have execute permission and could, therefore, be used in
  234. attempts to break into the server.
  235. I recommend disabling all execute permissions and instructing your users to
  236. use the chmod command to add execute permissions to directories or to
  237. change the umask before creating directories.  This may be a bit more work
  238. for your users, but it is safer than having a Trojan Horse program marked
  239. executable just waiting for someone, possibly root, to try running it.
  240. umask and chmod command restrictions
  241. ------------------------------------
  242. As just mentioned, users have the ability to change the current umask and
  243. modify the permissions on files and directories.
  244. Obviously, you will want to disable this feature for anonymous users.  You
  245. may also want to control who may use these features for your guest and real
  246. users.  The defaults should be acceptable for most sites.  The default
  247. settings are equivalent to the following (which you may want to add to your
  248. ftpaccess file so you don't forget):
  249. chmod no  anonymous
  250. chmod yes real,guest
  251. umask no  anonymous
  252. umask yes real,guest
  253. If, for example, you wanted to disable these commands for guests accessing
  254. the server from outside the local network, you could add the following:
  255. chmod no  class=remote
  256. umask no  class=remote
  257. Be sure to insert these _before_ the 'yes' clauses.  Order is important;
  258. the daemon will apply the first matching rule it finds.   If you do
  259. something like this, it is probably safer to rewrite the clauses to deny
  260. everything but what you allow.  For example:
  261. chmod yes real,class=local
  262. umask yes real,class=local
  263. chmod no  guest,anonymous
  264. umask no  guest,anonymous
  265. Delete, overwrite, rename restrictions
  266. --------------------------------------
  267. The daemon also provides control over the user's ability to delete, over-
  268. write and rename files.  Again, the defaults are probably acceptable in
  269. most cases.  These are:
  270. delete no  anonymous
  271. delete yes real,guest
  272. rename no  anonymous
  273. rename yes real,guest
  274. overwrite no  anonymous
  275. overwrite yes real,guest
  276. As with the chmod and umask clauses, you can control these by class as
  277. well.  Continuing the above example, restricting these to local users only,
  278. we could instead say:
  279. delete    yes real,class=local
  280. rename    yes real,class=local
  281. overwrite yes real,class=local
  282. delete    no  guest,anonymous
  283. rename    no  guest,anonymous
  284. overwrite no  guest,anonymous
  285. Per-class upload clauses
  286. ------------------------
  287. Just as we can restrict the ability to change permissions, delete files,
  288. etc., we can also define upload clauses which apply only to specific
  289. classes of users.  For instance, with the classes from the above examples,
  290. we can revoke upload rights for remote guests.
  291. For example, we can deny all uploads the remote guests except to their
  292. personal tmp directories:
  293. upload class=remote /home/users/* *      no
  294. upload class=remote /home/users/* /*/tmp yes nodirs
  295. Private incoming areas
  296. ----------------------
  297. Often times, users would like to have private areas in the FTP site.
  298. Sometimes, it is usefull to also have incoming areas in those private
  299. areas.  Examples of the permissions for private areas can be found in the
  300. layout at ftp://ftp.wu-ftpd.org/pub/wu-ftpd/examples/ and, other than
  301. ownership, are no different than the public incoming area, so I'll simply
  302. present the upload clauses here.
  303. For this example, we'll allow anonymous uploads into all private incoming
  304. areas:
  305. upload /home/ftp            /private/*/incoming          yes * * 0440 nodirs
  306. upload /home/users/ftpadmin /home/ftp/private/*/incoming yes * * 0440 nodirs
  307. The assumption here is Unix shell users have private areas in the anonymous
  308. site.  Those areas are owned by the appropriate user, and incoming files
  309. are to be owned by that user.  The wildcard match on directory allows
  310. anonymous uploading to any private incoming directory.  The wildcard for
  311. owning user and group instructs the daemon to set the file's ownership to
  312. that of the directory receiving it.
  313. Don't forget, if you allow private incoming areas, they are open for
  314. anonymous access and you should take care to ensure a DoS attempt to fill
  315. the file system cannot take out your entire server.  Create a separate
  316. filesystem for the private incoming areas or put them inside the public
  317. incoming area.
  318. Differences from earlier versions
  319. ---------------------------------
  320. This HOWTO was written for  version 2.6.0 of the WU-FTPD server.  Earlier
  321. versions used different rules for the upload clause.
  322. Some versions of the daemon required the first parameter to be the name of
  323. the root directory for the chroot.  This allowed upload control by area,
  324. but did not provide for different rules on a per-user basis.
  325. Some versions of the daemon required the first parameter to be lexically
  326. identical to the user's home directory entry.  This was non-obvious and the
  327. '/./' was often forgotten.
  328. Some versions of the daemon got totally confused, attempted to apply both
  329. these methods at once, and ended up ignoring all your upload rules.  If you
  330. were smart, you had your permissions set properly and didn't notice.
  331. Early versions of the VR upgrades, and all earlier versions of the daemon,
  332. allowed file system modification as the default for all users.  The current
  333. version does not allow any modification commands (ie., upload, delete,
  334. rename) by anonymous users unless specifically granted in the ftpaccess
  335. file.
  336. Early versions of the VR upgrades, and all earlier versions of the dameon,
  337. had no method for specifying the permissions for a newly created directory.
  338. Also, they required exact matches for the first parameter (no globbing) and
  339. exact user and group names or numbers for ownership file files and
  340. directories.
  341. -- 
  342. Gregory A Lundberg              WU-FTPD Development Group
  343. 1441 Elmdale Drive              lundberg@wu-ftpd.org
  344. Kettering, OH 45409-1615 USA    1-800-809-2195