はじめに
SFTP (Secure File Transfer Protocol) は、ネットワーク経由でファイルを転送するための強力で安全なソリューションです。このチュートリアルでは、SFTP の理解、'Permission Denied' エラーのトラブルシューティング、および Linux システムでの SFTP パーミッション問題の解決について説明します。SFTP サーバーのセットアップ、適切なパーミッションを持つユーザーの作成、ファイル転送中に発生する一般的なパーミッション問題の診断方法を学びます。
Ubuntu での SFTP サーバーのセットアップ
SFTP (Secure File Transfer Protocol) は、システム間でファイルを転送するための安全な方法を提供します。通常の FTP とは異なり、SFTP は転送中にコマンドとデータの両方を暗号化し、不正アクセスから情報を保護します。
このステップでは、Ubuntu システムに基本的な SFTP サーバーをセットアップします。
OpenSSH サーバーのインストール
まず、システムが最新であることを確認し、SFTP 機能を含む OpenSSH サーバーをインストールしましょう。
sudo apt update
sudo apt install -y openssh-server
これらのコマンドを実行すると、次のような出力が表示されるはずです。
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
openssh-server is already the newest version (1:8.9p1-3ubuntu0.1).
SSH サービスステータスの確認
Docker コンテナ内にあるため、標準の systemctl コマンドは機能しません。プロセスステータス コマンドを使用して、SSH サービスが実行されているかどうかを確認しましょう。
ps aux | grep sshd
sshd が実行されていることを示す出力が表示されるはずです。
root 1234 0.0 0.1 12016 5604 ? Ss 10:20 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
SFTP 用のテストユーザーの作成
SFTP 機能のテスト専用のユーザーを作成しましょう。
sudo adduser sftpuser
プロンプトが表示されたら、password123 のような簡単なパスワードを入力し、Enter キーを押して追加のユーザー情報フィールドをスキップできます。次のような出力が表示されるはずです。
Adding user `sftpuser' ...
Adding new group `sftpuser' (1001) ...
Adding new user `sftpuser' (1001) with group `sftpuser' ...
Creating home directory `/home/sftpuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
SFTP 転送用のテストファイルの作成
次に、SFTP 転送に使用するテストファイルをホームディレクトリに作成しましょう。
cd ~/project
echo "This is a test file for SFTP transfers" > testfile.txt
echo "This file has different permissions" > restrictedfile.txt
ファイルが正しく作成されたことを確認しましょう。
ls -l testfile.txt restrictedfile.txt
次のような出力が表示されるはずです。
-rw-rw-r-- 1 labex labex 37 Sep 28 10:30 restrictedfile.txt
-rw-rw-r-- 1 labex labex 38 Sep 28 10:30 testfile.txt
デフォルトでは、両方のファイルは所有者とグループに対して読み取りおよび書き込み権限を持ち、他のユーザーに対しては読み取り専用権限を持ちます。次のステップで、これらのパーミッションの変更を試します。
ファイルパーミッションとその SFTP への影響の理解
SFTP パーミッションの問題を調査する前に、Linux のファイルパーミッションシステムと、それが SFTP 操作にどのように影響するかを理解しましょう。
Linux ファイルパーミッションの基本
Linux では、すべてのファイルとディレクトリには 3 種類のパーミッションがあります。
- 読み取り (r): ファイルの内容の表示またはディレクトリの内容のリスト表示を許可します
- 書き込み (w): ファイルの変更またはディレクトリ内でのファイルの作成/削除を許可します
- 実行 (x): ファイルの実行またはディレクトリへのアクセスを許可します
これらのパーミッションは、3 つのユーザーカテゴリに割り当てられます。
- 所有者:ファイルを作成したユーザー
- グループ:ファイルに割り当てられたグループ
- その他:それ以外のすべてのユーザー
現在のパーミッションの表示
テストファイルの現在のパーミッションを確認しましょう。
ls -l ~/project/testfile.txt ~/project/restrictedfile.txt
次のような出力が表示されます。
-rw-rw-r-- 1 labex labex 38 Sep 28 10:30 /home/labex/project/testfile.txt
-rw-rw-r-- 1 labex labex 37 Sep 28 10:30 /home/labex/project/restrictedfile.txt
パーミッション文字列 -rw-rw-r-- は次のように分解できます。
- 最初の文字
-は通常のファイルを示します (ディレクトリの場合はdになります) - 次の 3 文字
rw-は所有者のパーミッションを示します (読み取り、書き込み、実行なし) - 次の 3 文字
rw-はグループのパーミッションを示します (読み取り、書き込み、実行なし) - 最後の 3 文字
r--はその他のパーミッションを示します (読み取りのみ)
ファイルパーミッションの変更
SFTP でパーミッション拒否エラーが発生する可能性のあるシナリオを作成するために、ファイルのパーミッションを変更しましょう。
## testfile.txt を誰でも読み取り可能にし、所有者のみが書き込み可能にする
chmod 644 ~/project/testfile.txt
## restrictedfile.txt を所有者のみがアクセスできるようにする
chmod 600 ~/project/restrictedfile.txt
次に、変更を確認しましょう。
ls -l ~/project/testfile.txt ~/project/restrictedfile.txt
更新されたパーミッションが表示されるはずです。
-rw-r--r-- 1 labex labex 38 Sep 28 10:30 /home/labex/project/testfile.txt
-rw------- 1 labex labex 37 Sep 28 10:30 /home/labex/project/restrictedfile.txt
SFTP テスト用のディレクトリのセットアップ
SFTP テスト専用のディレクトリを作成しましょう。
mkdir -p ~/project/sftp_test
echo "This file is in the SFTP test directory" > ~/project/sftp_test/test_file.txt
chmod 755 ~/project/sftp_test
次に、制限付きパーミッションを持つディレクトリを作成しましょう。
mkdir -p ~/project/restricted_sftp
echo "This file is in the restricted directory" > ~/project/restricted_sftp/restricted_file.txt
chmod 700 ~/project/restricted_sftp
ディレクトリのパーミッションを確認しましょう。
ls -ld ~/project/sftp_test ~/project/restricted_sftp
次のように表示されるはずです。
drwxr-xr-x 2 labex labex 4096 Sep 28 10:35 /home/labex/project/sftp_test
drwx------ 2 labex labex 4096 Sep 28 10:35 /home/labex/project/restricted_sftp
sftp_test ディレクトリには誰でもアクセスできますが、restricted_sftp ディレクトリには所有者 (labex ユーザー) のみがアクセスできます。
SFTP のパーミッション拒否エラーの体験と診断
このステップでは、SFTP サーバーに接続し、パーミッション拒否エラーを直接体験します。これにより、パーミッション設定が SFTP 操作にどのように影響するかを理解できます。
SFTP サーバーへのローカル接続
ローカル環境で作業しているため、localhost アドレスを使用して SFTP サーバーに接続できます。先ほど作成した sftpuser を使用して接続しましょう。
sftp sftpuser@localhost
パスワードの入力を求められたら、sftpuser アカウントに設定したパスワード (例:password123) を入力します。接続が成功すると、次のようなプロンプトが表示されます。
Connected to localhost.
sftp>
接続に問題が発生した場合は、SSH サービスがコンテナ内で正しく実行されていないことが原因である可能性があります。exit で終了し、理論的な例を使用して次のステップに進むことができます。
基本的な SFTP コマンド
いくつかの基本的な SFTP コマンドを見てみましょう。
- リモートサーバー上の現在のディレクトリを表示します。
sftp> pwd
Remote working directory: /home/sftpuser
- 現在のディレクトリ内のファイルを一覧表示します。
sftp> ls
- 別のディレクトリに移動します。
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
- ホームディレクトリに戻ります。
sftp> cd
sftp> pwd
Remote working directory: /home/sftpuser
さまざまなパーミッションを持つファイルへのアクセスを試みる
次に、SFTP セッションからテストファイルにアクセスしてみましょう。
- プロジェクトディレクトリからファイルを取得してみましょう。
sftp> get /home/labex/project/testfile.txt
Fetching /home/labex/project/testfile.txt to testfile.txt
Permission denied
「Permission denied (パーミッション拒否)」エラーが表示されることに気付くでしょう。これは、sftpuser に labex ユーザーのホームディレクトリ内のファイルにアクセスする権限がないためです。
SFTP セッションの終了
続行するために、SFTP セッションを終了しましょう。
sftp> exit
パーミッション拒否エラーの理解
SFTP で「Permission denied (パーミッション拒否)」エラーが発生する一般的な理由はいくつかあります。
- ファイルパーミッション: ユーザーにファイルの読み取り/書き込みアクセス権がない
- ディレクトリパーミッション: ユーザーがファイルを含むディレクトリにアクセスできない
- 所有権の問題: ファイル/ディレクトリが別のユーザーまたはグループに属している
- パス走査の制限: SFTP 設定により、ユーザーが特定のディレクトリに制限される可能性がある
SFTP ユーザーがアクセスできるように、テストファイルの 1 つを作成しましょう。
## 他のユーザーがアクセスできるディレクトリを作成する
mkdir -p /tmp/shared
echo "This is a shared file for SFTP testing" > /tmp/shared/shared_file.txt
chmod 777 /tmp/shared
chmod 666 /tmp/shared/shared_file.txt
次に、SFTP に再接続して、このファイルへのアクセスを試みます。
sftp sftpuser@localhost
接続後、次を試してください。
sftp> get /tmp/shared/shared_file.txt
Fetching /tmp/shared/shared_file.txt to shared_file.txt
/tmp/shared/shared_file.txt 100% 36 1.0KB/s 00:00
ディレクトリとファイルのどちらにもすべてのユーザーに読み取り/書き込み権限を付与したため、これは機能するはずです。
SFTP セッションをもう一度終了します。
sftp> exit
デバッグモードでの SFTP の使用
パーミッションエラーに関する詳細情報を取得するには、デバッグモードで SFTP を使用できます。
sftp -v sftpuser@localhost
詳細な出力には、接続と発生したエラーに関する詳細情報が表示されます。
debug1: Sending subsystem: sftp
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 2412, received 2876 bytes, in 0.1 seconds
Bytes per second: sent 30074.7, received 35857.2
debug1: Exit status 0
SFTP のパーミッション拒否エラーの解決
パーミッションが SFTP アクセスにどのように影響するかを理解したので、一般的なパーミッション拒否エラーを解決する方法を学びましょう。
解決策 1: ファイルとディレクトリのパーミッションの調整
パーミッションの問題に対する最も直接的な解決策は、ファイルとディレクトリのパーミッションを調整することです。新しいテストケースを作成しましょう。
## 制限付きパーミッションを持つ新しいテストファイルを作成する
echo "This file has restricted permissions" > ~/project/restricted_access.txt
chmod 600 ~/project/restricted_access.txt
現在のパーミッションを確認します。
ls -l ~/project/restricted_access.txt
出力:
-rw------- 1 labex labex 35 Sep 28 11:05 /home/labex/project/restricted_access.txt
次に、このファイルをパーミッションを変更して他のユーザーがアクセスできるようにしましょう。
chmod 644 ~/project/restricted_access.txt
ls -l ~/project/restricted_access.txt
出力:
-rw-r--r-- 1 labex labex 35 Sep 28 11:05 /home/labex/project/restricted_access.txt
これらのパーミッション (644) では、ファイルの所有者 (labex) はファイルを読み書きでき、グループメンバーとその他は読み取りのみできます。
解決策 2: ファイル所有者の変更
もう 1 つの解決策は、ファイルの所有権を SFTP ユーザーに合わせることです。別のテストファイルを作成しましょう。
echo "This file will be owned by sftpuser" > ~/project/ownership_test.txt
次に、所有権を SFTP ユーザーに変更しましょう。
sudo chown sftpuser:sftpuser ~/project/ownership_test.txt
ls -l ~/project/ownership_test.txt
出力:
-rw-rw-r-- 1 sftpuser sftpuser 36 Sep 28 11:10 /home/labex/project/ownership_test.txt
これで、ファイルは sftpuser が所有し、sftpuser はそれを読み書きできます。
解決策 3: 共有ディレクトリの作成
SFTP ファイル共有の一般的な解決策は、複数のユーザーがアクセスできる適切なパーミッションを持つディレクトリを作成することです。
## 適切なパーミッションを持つ新しい共有ディレクトリを作成する
mkdir -p /tmp/sftp_shared
sudo chown labex:labex /tmp/sftp_shared
chmod 755 /tmp/sftp_shared
## すべてのユーザーが書き込み可能なアップロード用のサブディレクトリを作成する
mkdir -p /tmp/sftp_shared/uploads
chmod 777 /tmp/sftp_shared/uploads
## 共有ディレクトリにサンプルファイルを作成する
echo "This file is in the shared SFTP directory" > /tmp/sftp_shared/sample.txt
chmod 644 /tmp/sftp_shared/sample.txt
設定を確認しましょう。
ls -la /tmp/sftp_shared/
出力:
total 12
drwxr-xr-x 3 labex labex 4096 Sep 28 11:15 .
drwxrwxrwt 4 root root 4096 Sep 28 11:15 ..
-rw-r--r-- 1 labex labex 39 Sep 28 11:15 sample.txt
drwxrwxrwx 2 labex labex 4096 Sep 28 11:15 uploads
この設定では、次のようになります。
- メインディレクトリは誰でも読み取りおよび実行できますが、所有者のみが書き込みできます
- uploads サブディレクトリは誰でも書き込み可能です (SFTP アップロードに適しています)
- sample.txt ファイルは誰でも読み取り可能ですが、所有者のみが書き込み可能です
この構成により、SFTP ユーザーは次のことができます。
- 共有ディレクトリに移動する
- サンプルファイルを読み取る
- uploads ディレクトリにファイルをアップロードする
解決策 4: よりきめ細かい制御のための ACL の使用
アクセス制御リスト (ACL) は、より詳細なパーミッション管理を提供します。必要なパッケージをインストールして、ACL を使用しましょう。
sudo apt install -y acl
次に、ファイルを作成し、ACL を使用して特定のパーミッションを設定しましょう。
echo "This file uses ACLs for permissions" > ~/project/acl_test.txt
## 基本的なパーミッションを設定する
chmod 640 ~/project/acl_test.txt
## sftpuser の ACL パーミッションを追加する
sudo setfacl -m u:sftpuser:r ~/project/acl_test.txt
## ACL 設定を表示する
getfacl ~/project/acl_test.txt
出力:
## file: /home/labex/project/acl_test.txt
## owner: labex
## group: labex
user::rw-
user:sftpuser:r--
group::r--
mask::r--
other::---
この ACL 構成により、次のことが可能になります。
- ファイル所有者 (labex) は読み書きできます
- sftpuser はファイルを読み取ることができます
- グループはファイルを読み取ることができます
- その他はアクセスできません
SFTP パーミッション管理のベストプラクティス
この最終ステップでは、SFTP パーミッションを管理し、パーミッションの問題を効果的にトラブルシューティングするためのベストプラクティスについて説明します。
専用 SFTP ユーザーグループの作成
SFTP ユーザー専用のグループを作成することをお勧めします。
sudo groupadd sftp_users
sudo usermod -a -G sftp_users sftpuser
ユーザーがグループに追加されたことを確認します。
groups sftpuser
出力:
sftpuser : sftpuser sftp_users
グループ管理ディレクトリの設定
次に、sftp_users グループによって管理されるディレクトリを作成しましょう。
## SFTP グループ用の新しいディレクトリを作成する
sudo mkdir -p /tmp/sftp_group_shared
sudo chown labex:sftp_users /tmp/sftp_group_shared
sudo chmod 770 /tmp/sftp_group_shared
## SGID ビットを設定して、新しいファイルがグループを継承するようにする
sudo chmod g+s /tmp/sftp_group_shared
## このディレクトリにテストファイルを作成する
echo "This file is in the SFTP group directory" > /tmp/sftp_group_shared/group_file.txt
パーミッションを確認しましょう。
ls -la /tmp/sftp_group_shared/
出力:
total 12
drwxrws--- 2 labex sftp_users 4096 Sep 28 11:25 .
drwxrwxrwt 5 root root 4096 Sep 28 11:25 ..
-rw-rw-r-- 1 labex sftp_users 42 Sep 28 11:25 group_file.txt
グループパーミッションの s は SGID ビットが設定されていることを示しており、このディレクトリに作成された新しいファイルは sftp_users グループを継承することを意味します。
SFTP パーミッションの一般的なトラブルシューティングコマンド
SFTP パーミッションの問題をトラブルシューティングする場合、これらのコマンドが特に役立ちます。
- ファイルパーミッションを確認します。
ls -la /path/to/file
- ユーザーグループを確認します。
groups username
- 現在のユーザー ID とグループ ID を確認します。
id
- SFTP サーバーログを表示します。
## 本番システムでは、システムログを確認します
## 実験環境では、ログの表示をシミュレートできます
grep "sshd" /var/log/auth.log | tail
- コマンドラインからファイルアクセスをテストします。
sudo -u sftpuser cat /path/to/file
パーミッション拒否エラーの意思決定ツリー
SFTP でパーミッション拒否エラーが発生した場合は、この意思決定ツリーに従ってください。
SFTP ユーザーは親ディレクトリにアクセスできますか?
- 次で確認します:
sudo -u sftpuser ls -la /path/to/directory/ - 次で修正します:
chmod o+x /path/to/directory/
- 次で確認します:
SFTP ユーザーはファイルを読み取ることができますか?
- 次で確認します:
sudo -u sftpuser cat /path/to/file - 次で修正します:
chmod o+r /path/to/fileまたはsetfacl -m u:sftpuser:r /path/to/file
- 次で確認します:
SFTP ユーザーはファイルまたはディレクトリに書き込むことができますか?
- 次で確認します:
sudo -u sftpuser touch /path/to/directory/test_file - 次で修正します:
chmod o+w /path/to/directory/またはsetfacl -m u:sftpuser:w /path/to/directory/
- 次で確認します:
SFTP パーミッションのテストスクリプトの作成
SFTP ユーザーが特定のファイルとディレクトリにアクセスできるかどうかを確認する簡単なテストスクリプトを作成しましょう。
cat > ~/project/check_sftp_permissions.sh << 'EOF'
#!/bin/bash
USER="sftpuser"
echo "Testing SFTP permissions for user: $USER"
echo "-------------------------------------------"
## Test directories
for DIR in /tmp/shared /tmp/sftp_shared /tmp/sftp_group_shared /home/labex/project; do
echo -n "Can $USER access $DIR? "
if sudo -u $USER ls -la $DIR &>/dev/null; then
echo "YES"
else
echo "NO"
fi
done
## Test files
for FILE in /tmp/shared/shared_file.txt /tmp/sftp_shared/sample.txt /home/labex/project/testfile.txt; do
echo -n "Can $USER read $FILE? "
if sudo -u $USER cat $FILE &>/dev/null; then
echo "YES"
else
echo "NO"
fi
done
echo "-------------------------------------------"
echo "Testing complete!"
EOF
chmod +x ~/project/check_sftp_permissions.sh
次に、テストスクリプトを実行します。
sudo ~/project/check_sftp_permissions.sh
SFTP ユーザーがアクセスできるディレクトリとファイルを示す出力が表示されます。これにより、パーミッションの問題をすばやく特定できます。
SFTP パーミッション管理の最終的なヒント
- 最小権限の原則を使用する: 必要な最小限のパーミッションのみを付与します
- 定期的にパーミッションを監査する:
findなどのツールを使用して、不適切なパーミッションを持つファイルを特定します - パーミッション構造を文書化する: どのユーザーとグループがどのディレクトリにアクセスできるかを追跡します
- SFTP chroot jail の使用を検討する: 本番環境では、ユーザーを特定のディレクトリに制限します
- ユーザーの視点からテストする: 常に実際の SFTP ユーザーとしてテストして、パーミッションを確認します
まとめ
このチュートリアルでは、SFTP サーバーの設定、適切なパーミッションを持つユーザーの作成、および一般的なパーミッション拒否エラーのトラブルシューティングについて学びました。以下の実践的な経験を積みました。
- Ubuntu で SFTP サーバーをインストールして設定する
- Linux ファイルパーミッションとその SFTP アクセスへの影響を理解する
- パーミッション拒否エラーを体験し、診断する
- パーミッションの問題を解決するためのさまざまなソリューションを実装する
- SFTP パーミッション管理のベストプラクティスを適用する
これらのスキルは、パーミッション関連の問題を最小限に抑えながら、安全な環境でファイル転送を効果的に管理するのに役立ちます。セキュリティ要件とユーザーアクセスニーズのバランスを取りながら、安全でありながら機能的な SFTP サーバーを維持するには、適切なパーミッション管理が不可欠であることを忘れないでください。



