概要
基本的な所は以下等でお願いします。
WindowsでFTPサーバー構築 - Qiita
https://qiita.com/A-Kira/items/b9a629647ab0bdf9e4b1
前提として、FTPサーバ有効化して、IISマネージャ用意したところからです。
その先で詰まったあたりをまとめます。
やる事としては、いくつかのフォルダを用意したWindowsにFTPサーバを立てて、それぞれのフォルダを違う権限で(=違うユーザアカウントとして)アクセスしたい。を実現する方法です。
勘所
PCに登録されているユーザのうち、IISマネージャーで登録されたユーザ
=
FTPサーバにログインするユーザ
となります。
ログインしたユーザは、アクセスするフォルダへのアクセス権が必要になり、これは**「FTP サーバで設定されたアクセス権」と「ローカル上のアクセス権」の両方になります(ファイル共有へのアクセス権は不要です)。
具体的には、IISマネージャーのFTP 認証**の設定と、ファイル・フォルダのプロパティの「セキュリティ」タブの権限です。
具体的な操作
ユーザの用意
・コンピューターの管理->ローカル ユーザーとグループ->ユーザーから、ユーザを追加する
・空パスワードはFTPログイン時に失敗するので不可(空パスワードでも作成は出来てしまう)
・~パスワードの変更が必要のチェックは外しておく
・ローカルパスとかその他設定不要。PC上に存在するようになればいい
・権限の種類分けをしたい数だけユーザを作る
例:aaaa, bbbb の2つのユーザを作成
FTPサイトの追加
・コンピューターの管理->サービスとアプリケーション->インターネット インフォメーション サービス (IIS) マネージャー->サイトから、FTPサイトを追加する
・「Webサイトの追加」ではない
・2個作ると、FTPサーバが2つ起動するような動きになるため、2個以上作らないこと。
・FTP サイト名:任意
・コンテンツ ディレクトリ->物理パス:FTPでアクセスされたときのルートとなるフォルダを指定する。
例:サイト名:hoge
、物理パス:C:\hoge\
・バインドとSSL:SSL 無しにチェック
・認証:基本のみにチェック
・承認:指定されたユーザーにして、先ほど作ったユーザ名を書く。
あとで**「FTP 認証」**から追加できるので、ここで書かなくてもいい。
・アクセス許可:ローカルのアクセス権限とは別なので、まずはここで必要なものをチェックする。
ファイアウォールの設定
必要に応じて設定。
Windows標準のftp
コマンドは、アクティブモード
(ポート固定のモード。クライアント側も20番ポートの開放が必要)しかないので注意。
WinSCP等からパッシブモード
(クライアント側はファイアウォールの中にいてもOK)で接続を受ける場合、IISマネージャーから「FTP ファイアウォールのサポート」にて、データ送受信に払い出すポートを設定しておく。範囲は、同時接続数の分以上必要になるはず(切断やエラーでもしばらく生き残ったりを考えると、同時接続数の数倍ある方がいいかも)。また、ウェルノウンポートを避ける事。登録済みポート番号も避けた方が良い。(とりあえず、50000~50100くらい指定しておけば問題ないと思う、他で使ってなければ。)
なお、Windowsからパッシブモードの接続をコマンドラインやバッチファイルで使いたい場合、WinSCPのCUIモード(インストールすると同時に生成されるWinSCP.com
)に/PASSIVE
を指定して使う手がある。詳細はWinSCPのマニュアルを参照。
ウェルノウンポートや登録済みポートは以下等を参照
TCPやUDPにおけるポート番号の一覧 - Wikipedia
https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7
FTP ユーザの分離
ここが肝。
「ユーザーを分離しない。」にチェックが2つ、「ユーザーを分離する」の方にチェックが4つ(うち1つの「カスタム」はグレーアウト)
ユーザーを分離しない場合、先ほど設定したFTPサイトのサブフォルダー含め全てアクセス可能になってしまうので、今回は分離する。
ただし、分離すると途端にアクセス出来なくなることがあるので以下熟読のこと。
ここで選択するのは、ユーザーを分離するの方にある「ユーザー名ディレクトリ(グローバルな仮想ディレクトリを無効にします。
」
このチェックを入れることで、FTPでログインして来たユーザのアクセスする物理パスは「[FTPサイトの物理パス]\LocalUser\[ユーザー名]
」となる。
例:「C:\hoge\LocalUser\aaaa\
」「C:\hoge\LocalUser\bbbb\
」になるので、物理パス以下を用意する。
アクセス権限の設定
今回の場合、IISマネージャーから設定するFTP 認証と、上記フォルダのローカルのアクセス権限が必要。
IISマネージャーでFTP 認証に、ユーザが登録されていて、アクセス権限が付与されているか確認。
例:aaaa
が登録されており、読み取り
権限が付いていることを確認。bbbb
が登録されており、読み取り
、書き込み
権限が付いていることを確認。
ローカルの方は、ユーザがアクセスするフォルダのプロパティの「セキュリティ」タブで、ユーザーを追加し、アクセス権限が付与されていることを確認。
この時、「共有」タブの設定は不要。FTPアクセスするユーザが所有者である必要もない。
例:「C:\hoge\LocalUser\aaaa\
」フォルダを作成し、そのプロパティ->「セキュリティ」タブを開き「編集」->開いたダイアログで「追加」->選択するオブジェクト名に、ユーザ名を打ち「名前の確認」を押して、「[PC名]\aaaa
」となったらOK。詳細設定から検索して、選択してもよい。戻ったダイアログの下で、「フォルダーの内容の一覧表示
」「読み取り
」のチェックを入れる。同様に、「C:\hoge\LocalUser\bbbb\
」フォルダを作成しプロパティから、[PC名]\bbbb
を追加し、「フォルダーの内容の一覧表示
」「読み取り
」「書き込み
」にチェック入れる。
動作確認
コマンドプロンプト等なら
ftp [IPアドレス]
(ポート変えているならftp [IPアドレス]:[ポート番号]
)
[ユーザ名]
[パスワード]
(表示されない)
でログインできたら成功
530 Login failed.的な感じであっさり終わってるなら、ログインに失敗。
530 エラーにつづけて、フォルダにアクセスできません的なエラーなら、ログインはできたが、フォルダへのアクセス権限がなかったか、フォルダが存在しない。
まとめ
「ユーザーを分離する」にしたとき、ログイン先が** [FTPサイトの物理パス]\LocalUser\[ユーザ名]\ **に変わるのに気づかずハマりました。