MYSQLデータベースにユーザーストレージがあるPure-FTPD

画像
以前は、FTPサーバーを複数回構成する必要があり(数分で完了 )、どういうわけかProFtpdが無条件の候補であることが判明しました。 この同志はそれほど前に問題を抱えていなかったので、彼は何か他のものを試すことに決め、後悔しませんでした

私の選択はすばらしいPure-FTPd FTPサーバーでした。
インストール後、次の一連の機能を受け取ります。



使用されている OSはFreeBSDです。 さあ、行こう! DBMS MySqlがインストールおよび構成されていることを前提としています。 ポートからPure-FTPdをインストールします(以前のアップグレード)
cd /usr/ports/ftp/pure-ftpd make install clean 

次のオプションを選択しました

インストール後、デフォルトファイルから設定を作成します
 cd /usr/local/etc/ cp pureftpd-mysql.conf.sample pureftpd-mysql.conf cp pure-ftpd.conf.sample pure-ftpd.conf 

メイン構成ファイルの編集
pure-ftpd.conf
#フォルダー内のすべてのユーザーをChroot`
ChrootEveryone yes

#前のオプションで「いいえ」が選択された場合、次のオプションのメンバー
#グループはchrootしません。 残りはすべてです。 したくない場合
#全員にchrootし、ChrootEveryoneとTrustedGIDのコメントを外します。
#TrustedGID 100

#顧客曲線の互換性機能を有効にする
BrokenClientsCompatibilityいいえ

#同時ユーザーの最大数
MaxClientsNumber 50

#バックグラウンドで動作(デーモン)
はい、デーモン化する

#1つのIPからの同時接続の最大数
MaxClientsPerIP 8

#すべてのクライアントコマンドを記録する場合は、これ
#ポイントは「はい」でなければなりません。 あなたも記録する必要がある場合
#サーバー応答、そしてこのアイテムを複製します。
VerboseLog no

#クライアントがある場合でも、ピリオドで始まるファイルを表示するかどうか
#明らかに、オプション「-a」を使用してこれを行う必要があるとは言わない。
DisplayDotFilesはい

#認証されたユーザーを許可しない-このFTP
#匿名のお客様のみ。
匿名のみ

#匿名を拒否-登録ユーザーのFTPを最新にします。
匿名

#syslogツール(auth、authpriv、daemon、ftp、security、user、local *)
#デフォルト-「ftp」。 「なし」-ロギングを無効にします。
SyslogFacility ftp

#Cookieを表示しますか? (フォーチュンクッキーの表示)
#FortunesFile / usr / share / fortune / zippy

#ログ内のホスト名を解決しないでください。 ログはあまり有益ではなくなり、
#必要なリソースも少なくなります。 「はい」-非常に賭けるのは理にかなっています
#ロードされたサーバー、またはアイドルDNS
はい

#最大ダウンタイム(接続切断の終了時)、分単位
#(デフォルト= 15分)
MaxIdleTime 15

#LDAP構成ファイル(README.LDAPを参照)
#LDAPConfigFile /etc/pureftpd-ldap.conf

#MySQL構成ファイル(README.MySQLを参照)
MySQLConfigFile /usr/local/etc/pureftpd-mysql.conf

#Postgres構成ファイル(README.PGSQLを参照)
#PGSQLConfigFile /etc/pureftpd-pgsql.conf

#PureDBユーザーデータベース(README.Virtual-Usersを参照)
#PureDB /etc/pureftpd.pdb

#pure-authdソケットへのパス(README.Authentication-Modulesを参照)
#ExtAuth /var/run/ftpd.sock

#PAM認証を有効にする必要がある場合は、コメントを外します
#次の行
#PAMAuthenticationはい

#システム、Unix認証(/ etc / passwd)が必要な場合、
#次の行のコメントを外します
#UnixAuthenticationはい

#LDAPConfigFile、MySQLConfigFile、
#PAMAuthenticationおよびUnixAuthenticationは使用のみ可能
#1回、ただし一緒に使用できます。 たとえば、あなたが
#MySQLConfigFileを使用し、次にUnixAuthenticationを使用して、リクエストを送信します
#MySQLに。 そのようなユーザーがデータベースで見つからない場合、試行されます
#/ etc / passwdおよび/ etc / shadowのシステムユーザー。 SQLの場合
#パスワードが間違っているために認証が失敗する
#さらにユーザー検索を停止します。 認証方法
#は設定された順序で使用されます

# 'ls'コマンドの再帰制限。 最初の引数はファイルの最大数です
#表示されます。 2番目はサブディレクトリの最大数です
LimitRecursion 10000 8

#匿名には新しいディレクトリを作成する権利がありますか?
AnonymousCanCreateDirsいいえ

#システムがここに示されている値よりも多くロードされている場合、
#anonymosは何もダウンロードできません
最大負荷4

#パッシブ接続用のポートの範囲。 ファイアウォールがハッキングしている場合
#標準範囲
#PassivePortRange 30,000 50,000

#PASV / EPSV / SPSV応答の強制IPアドレス。 -NATの場合。
#シンボリックホスト名は、動的IPを使用するゲートウェイでも受け入れられます
#ForcePassiveIP 192.168.0.1

#匿名のアップロード/ダウンロード率。
#AnonymousRatio 1 10

#すべてのユーザーのアップロード/ダウンロードの比率。
#このディレクティブは前のものと重複しません。
#UserRatio 1 10

#「ftp」が所有するファイルのダウンロードを禁止します。
#ファイルはアップロードされましたが、ローカル(ローカル)管理者によって承認されていません。
AntiWarezはい

#リッスンしているIPアドレス/ポート(デフォルト=すべてのIPおよびポート21)。
#192.168.254.254,21にバインド

#匿名の最大速度(KB /秒)
#AnonymousBandwidth 8

#すべてのユーザー(匿名ユーザーを含む)の最大速度(KB / s)
#AnonymousBandwidthまたはUserBandwidthを使用し、両方を使用します。
#意味がありません。
#UserBandwidth 8

#作成されたファイルのマスク。 <ファイルのumask>:<ディレクトリのumask>。
#177:077-妄想している場合:)
#umaskは最大値(777)から差し引かれたときの数値であり、
#適切なマスクを取得します。 つまり 以下の場合、マスクはそれぞれ次のようになります。
#ファイルには644、ディレクトリには755
Umask 133:022

#ユーザーが起動される最小のUID。
#(ネイティブバージョンでは100でした。1000を設定しました)
MinUID 1000

#許可ユーザーのFXP転送を許可します。
AllowUserFXPいいえ

#匿名および非匿名のFXP転送を許可
AllowAnonymousFXPいいえ

#ユーザーは、ピリオド( '。')で始まるファイルを削除および変更できません
#所有者であっても。 TrustedGIDが有効になっている場合、このグループには
#これらのファイルへのアクセス。
ProhibitDotFilesWrite no

#ピリオドで始まるファイルの読み取りを禁止する
ProhibitDotFilesRead no

#ファイルを上書きしないでください。 アップロードされたファイルの名前が既にある場合
#存在する場合、自動的にfile.1、file.2、file.3、...に名前が変更されます
自動名前変更

#匿名ユーザーが新しいファイルをアップロードできないようにします(no =アップロードは許可されます)
AnonymousCantUpload no

#このIPアドレスへの接続のみが匿名ではない場合があります。 あなた
#このディレクティブを使用して複数のIPを使用できます
#匿名FTPの場合、プライベートで安全なIPを残す
#リモート管理。 また、不安定を許可することができます
#認証用のローカルIP(タイプ10.xxx)およびパブリックのままにする
#(匿名用)別のIP上のFTPサーバー。
#TrustedIP 10.1.1.1

#PIDをログの各行に追加する場合、
#次の行のコメントを解除します。
#LogPIDはい

#「apache」タイプの形式のログで追加のログファイルを作成します。
#fw.c9x.org-jedi [1975年12月13日:19:36:39]「GET /icap.tar.bz2」200 21808
#このログファイルは、次のプログラムで処理できます。
#Apacheログの分析。
#AltLog clf:/var/log/pureftpd.log

#最適化された形式で追加のログファイルを作成する
#統計レポート(このようなHZ。私は見る必要があります)
#AltLogの統計:/var/log/pureftpd.log

#W3C標準で転送されたファイルを使用して別のログを作成します
#(多くの市販のアナライザーと互換性があります)
#AltLog w3c:/var/log/pureftpd.log

#CHMODコマンドを無効にします。 ユーザーは権限を変更できません
#ファイルへ。
#NoChmodはい

#ユーザーにファイルのアップロードを許可しますが、ファイルの削除は許可しません。
#KeepAllFilesはい

#ユーザーのホームディレクトリを自動的に作成し、
#存在しない場合
#CreateHomeDir yes

#仮想クォータを有効にします。 最初の数は、ファイルの最大数です。
#2番目の数値は、メガバイト単位の最大サイズです。
#だから1000:10は各ユーザーを1000ファイルと10メガに制限します。
#クォータ1000:10

#スタンドアロンモードサポートを使用してpure-ftpdがコンパイルされている場合は、変更できます
#pidファイルの場所。 デフォルトの位置-/var/run/pure-ftpd.pid
#PIDFile /var/run/pure-ftpd.pid

#pure-ftpdがpure-uploadscriptサポートでコンパイルされている場合、
#次に、この項目を使用すると、新しくダウンロードした情報を書き込むことができます
#/var/run/pure-ftpd.upload.pipe内のファイルなので、pure-uploadscriptは
#それらを読み、ダウンロードしたファイルを処理します。
#CallUploadScript yes

#このオプションは、アップロードが匿名で許可されているサーバーで役立ちます。
#/ var / ftpが別の/ varセクションにある場合、これにより
#空き容量を節約し、ログファイルを保護します。 割合
#ここで指定された数を超えると、自動アップロードが禁止されます。
MaxDiskUsage 99

#ユーザーを許可する場合は、このオプションに「yes」を設定します
#ファイルの名前を変更します。
#NoRename yes

#「顧客証明」を有効にする:「chmod 0 public_html」などの何らかのエラー
#一緒に作業するとき、chtol ...要するに、これはバグではなく機能です... :)そして
#愚かなクライアントはあなたのサポートに負担をかけませんでした。
#段落。 クライアントがUnixについて少し知識がある場合、この機能
#役に立たない。 ホスティングがある場合-オンにします。
#(翻訳はほとんど逐語的です-しかし、私は何について理解していなかったか...)
CustomerProofはい

#並列プロセスの数。 サーバーが
#オプション '--with-peruserlimits'(ここでは、
#ほとんどのバイナリディストリビューターではそのままです)。
#形式:<ユーザーごとの最大セッション>:<匿名の最大セッション>
#たとえば、3:20は、認証されたユーザーが3つ持つことができることを意味します
#アクティブセッション。 すべての匿名アカウント-最大20セッション。
#PerUserLimits 3:20

#ファイルがサーバーにアップロードされ、以前のバージョン(同じ名前)がある場合、
#その後、古いファイルは削除または切り捨てられません。 ダウンロードが行われます
#アトミックロードの完了時に一時ファイルに
#ファイルの新しいバージョンに切り替えます。 たとえば、大きなPHPをロードする場合
#スクリプト、Apacheは完全にロードされるまで古いバージョンで動作します
#すぐに新しいものに切り替わります。現在のものは完全に転送されます
#このオプションは仮想クォータと互換性がありません。
#NoTruncate yes

#このオプションには次の3つの値を指定できます。
#0-SSL / TLS暗号化を無効にします(デフォルト)。
#1-暗号化された接続と通常の接続の両方を受け入れます。
#2-SSL / TLSを使用しない接続を拒否する、
#匿名接続を含む。
#これについて盲目的にコメントしないでください。 以下を確認してください:
#1)SSL / TLSサポートでコンパイルされたサーバー(--with-tls)、
#2)有効な証明書を入力し、
#3)互換性のある顧客のみがログインします。
#TLS 1

#SSL / TLS接続で受け入れられる暗号のリスト
#プレフィックス-S:SSLを完全に無効にしますが、TLSは無効にしません。
#TLSCipherSuite HIGH:中:+ TLSv1 :! SSLv2:+ SSLv3

#スタンドアロンモードで現在のIPv4アドレスをリッスンします(つまり、IPv6は無効になっています)
#デフォルトでは、IPv4とIPv6が含まれています。
IPV4のみはい

#スタンドアロンモードで現在のIPv6アドレスをリッスンします(つまり、IPv4は無効です)
#デフォルトでは、IPv4とIPv6が含まれています。
#IPV6のみはい

#ファイル名のUTF-8サポート(RFC 2640)
#サーバーファイルシステムのエンコーディングを定義し、オプションで、
#UTF-8を使用しないクライアントのデフォルトエンコーディング。
#pure-ftpdが '--with-rfc2640'でコンパイルされている場合、現在動作しています
FileSystemCharset utf-8
ClientCharset cp1251

MySqlデータベースを使用したPure-FTPdの構成と同様に
pure-ftpd.conf
#pureftpdのMySQL構成

#オプション:MySQLサーバーの名前またはIP。 これを聞かないで
#ローカルUNIXソケットが使用される場合の項目。
#MYSQLServer 127.0.0.1

#オプション:MySQLがハングするポート。 これを聞かないで
#ローカルUNIXソケットが使用される場合の項目。
#MYSQLPort 3306

#オプション:MySQLが同じホスト上にある場合、mysql.sockソケット名が設定されます。
MYSQLSocket /tmp/mysql.sock

#必須:データベースで使用するユーザー。
MYSQLUser pure-ftpd

#必須:MySQLにアクセスするユーザーのパスワード。
MYSQLPassword pure-ftpd

#必須:作業しているデータベース。
MYSQLDatabase pureftpd

#必須:パスワードをデータベースに保存する方法
#設定可能な値:「cleartext」、「crypt」、「md5」、「password」
#( "パスワード" = MySQLパスワード()関数)
#「any」を使用して「crypt」、「md5」、「password」を試すことができます
MYSQLCryptクリアテキスト

#後続のディレクティブでは、行の一部が最大で置き換えられます
#クエリ実行:

#\ Lは、ログインするユーザー名に置き換えられます。
#\ユーザーがクロールするサーバーのIPアドレスに置き換えられます
#\ Pは、ユーザーが接続しているポート番号に置き換えられます。
#\ Rは、ユーザーのIPアドレスに置き換えられます。
#\ Dは、長い10進数の形式のユーザーのIPアドレスに置き換えられます。
#(例:192.168.254.1 == 3232300545)。

#次を使用して、比較的複雑なデータベースクエリを計画できます。
#この変数セット。 1つのデータベースが複数のサーバーで使用されている場合、
#その「\ I」により、ユーザーがサーバーを壊しているかどうかを判断できます。

#データベースからパスワードを取得するクエリ:
MYSQLGetPW SELECT `password` FROM` users` WHERE` user` = "\ L" AND` active` = '1'

#システムユーザー名またはUIDを取得するクエリ
MYSQLGetUID SELECT `uid` FROM` users` WHERE` user` = "\ L"

#オプション:デフォルトのUID-取得を要求する代わりにMYSQLGetUID
#MYSQLDefaultUID 1000

#グループまたはgidの名前を取得するためのデータベースへのリクエスト
MYSQLGetGID SELECT `gid` FROM` users` WHERE` user` = "\ L"

#オプション:デフォルトのGID-クエリMYSQLGetGIDの代わり
#MYSQLDefaultGID 1000

#ハムスターのリクエスト
MYSQLGetDir SELECT `home` FROM` users` WHERE` user` = "\ L"

#オプション:ユーザーからの最大ファイル数のリクエスト
#(私は疑問に思う-これの深い意味は何ですか?
#サーバーchtolを起動しませんでしたか? :))
#「仮想クォータサポート」でコンパイルする必要があります。
MySQLGetQTAFS SELECT `QuotaFiles` FROM` users` WHERE` user` = "\ L"

#オプション:クォータ要求(ディスク使用量)
#メガバイト単位の数値。
#Pure-FTPdは「仮想クォータサポート」でコンパイルする必要があります。
MySQLGetQTASZ SELECT `QuotaSize` FROM` users` WHERE` user` = "\ L"

#オプション:関係。 ダウンロード/アップロード率のリクエスト。
#ドル; この関数でコンパイルしないでください。
MySQLGetRatioUL SELECT `ULRatio` FROM` users` WHERE` user` = "\ L"
MySQLGetRatioDL SELECT `DLRatio` FROM` users` WHERE` user` = "\ L"

#オプション:ユーザーのチャンネル幅。 サーバーは
#このオプションでコンパイル。 KB /秒の値。
MySQLGetBandwidthUL SELECT `ULBandwidth` FROM` users` WHERE` user` = "\ L"
MySQLGetBandwidthDL SELECT `DLBandwidth` FROM users WHERE` user` =" \ L "

#ハムスターからユーザーを解放します(〜)。 次の場合は絶対にしないでください:
#1)自分が何をしているかを正確に知っている。
#2)実ユーザーと仮想ユーザーは一致します。
#MySQLForceTildeExpansion 1

#テーブルをトランザクションに更新した場合(Gemini、
#BerkeleyDB、Innobase ...)、SQLトランザクションを有効にできます
#MyISAMデータベースを使用している場合はコメントを残し、
#またはMySQLの古いバージョン(<3.23.x)。
#MySQLTransactions On

次に、データベース自体( pureftpd )とユーザー( users )を含むテーブルを作成します
 CREATE TABLE `users` ( `User` varchar(50) NOT NULL DEFAULT '', `Password` varchar(250) DEFAULT '', `Uid` int(11) DEFAULT '10000', `Gid` int(11) DEFAULT '10000', `Dir` varchar(250) DEFAULT '', `QuotaFiles` int(11) DEFAULT NULL, `QuotaSize` int(11) DEFAULT '0', `ULRatio` int(11) DEFAULT '0', `DLRation` int(11) DEFAULT NULL, `ULBandwidth` int(11) DEFAULT '0', `DLBandwidth` int(11) DEFAULT '0', `Comment` tinytext, `active` int(11) DEFAULT '0', PRIMARY KEY (`User`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

/etc/rc.confに追加します
 pureftpd_enable="YES" 

FTPサーバーを起動します
 /usr/local/etc/rc.d/pure-ftpd start Starting pureftpd. Running: /usr/local/sbin/pure-ftpd -g/var/run/pure-ftpd.pid -A -c50 -B -C10 -D -fftp -I15 -lmysql:/usr/local/etc/pureftpd-mysql.conf -L10000:8 -m4 -s -U133:022 -u80 -k99 -Z -8utf-8 -9cp1251 

それがすべてでしょう。 ユーザーテーブルにユーザーを入力し(ユーザー名、パスワード、ホームディレクトリを指定)、接続を試行します。 しかし、私はユーザーのIPアドレスによってアクセスを制限する問題に悩まされていました。 古典的なケースでは、ipフィールドがユーザーテーブルに追加され、pureftpd-mysql.confのMYSQLGetPWのsqlクエリは次の形式を取ります。

 SELECT Password FROM users WHERE User='\L' AND ip='\R' 

しかし、彼は私に適していない。 まず、ユーザーごとに、接続元のIPアドレスを指定する必要があります。次に、単一のIPのみを指定できます。 実際には、特定のユーザーのみにIP'shnikをバインドする必要があり、1人のユーザーにn番目のIPアドレスを設定する機能が必要です。

MySqlの構文にはプログラム制御フロー関数が含まれており、その中にはIF関数が必要です

IPテーブルを作成する
 CREATE TABLE `ip` ( `user` varchar(200) DEFAULT NULL, `ip` varchar(16) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

MYSQLGetPWのsqlクエリを次の形式にします。
  SELECT IF((SELECT COUNT(`user`) FROM ip WHERE user='\L')=0, (SELECT Password FROM users WHERE User='\L'), (SELECT users.Password FROM users,ip WHERE users.User='\L' AND ip.ip='\R' AND ip.user='\L')) 

最終的に、IPテーブルのエントリが設定されていないすべてのユーザーはIPアドレスをチェックせずに認証され、IPテーブルに登録されているユーザーは接続しようとしているIPアドレスからチェックされ、設定できます1回のログインで無制限のIPアドレス

Source: https://habr.com/ru/post/J183170/


All Articles