Linux での SFTP パーミッション拒否エラーのトラブルシューティング方法

LinuxBeginner
オンラインで実践に進む

はじめに

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 コマンドを見てみましょう。

  1. リモートサーバー上の現在のディレクトリを表示します。
sftp> pwd
Remote working directory: /home/sftpuser
  1. 現在のディレクトリ内のファイルを一覧表示します。
sftp> ls
  1. 別のディレクトリに移動します。
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
  1. ホームディレクトリに戻ります。
sftp> cd
sftp> pwd
Remote working directory: /home/sftpuser

さまざまなパーミッションを持つファイルへのアクセスを試みる

次に、SFTP セッションからテストファイルにアクセスしてみましょう。

  1. プロジェクトディレクトリからファイルを取得してみましょう。
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 (パーミッション拒否)」エラーが発生する一般的な理由はいくつかあります。

  1. ファイルパーミッション: ユーザーにファイルの読み取り/書き込みアクセス権がない
  2. ディレクトリパーミッション: ユーザーがファイルを含むディレクトリにアクセスできない
  3. 所有権の問題: ファイル/ディレクトリが別のユーザーまたはグループに属している
  4. パス走査の制限: 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 パーミッションの問題をトラブルシューティングする場合、これらのコマンドが特に役立ちます。

  1. ファイルパーミッションを確認します。
ls -la /path/to/file
  1. ユーザーグループを確認します。
groups username
  1. 現在のユーザー ID とグループ ID を確認します。
id
  1. SFTP サーバーログを表示します。
## 本番システムでは、システムログを確認します
## 実験環境では、ログの表示をシミュレートできます
grep "sshd" /var/log/auth.log | tail
  1. コマンドラインからファイルアクセスをテストします。
sudo -u sftpuser cat /path/to/file

パーミッション拒否エラーの意思決定ツリー

SFTP でパーミッション拒否エラーが発生した場合は、この意思決定ツリーに従ってください。

  1. SFTP ユーザーは親ディレクトリにアクセスできますか?

    • 次で確認します:sudo -u sftpuser ls -la /path/to/directory/
    • 次で修正します:chmod o+x /path/to/directory/
  2. SFTP ユーザーはファイルを読み取ることができますか?

    • 次で確認します:sudo -u sftpuser cat /path/to/file
    • 次で修正します:chmod o+r /path/to/file または setfacl -m u:sftpuser:r /path/to/file
  3. 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 パーミッション管理の最終的なヒント

  1. 最小権限の原則を使用する: 必要な最小限のパーミッションのみを付与します
  2. 定期的にパーミッションを監査する: find などのツールを使用して、不適切なパーミッションを持つファイルを特定します
  3. パーミッション構造を文書化する: どのユーザーとグループがどのディレクトリにアクセスできるかを追跡します
  4. SFTP chroot jail の使用を検討する: 本番環境では、ユーザーを特定のディレクトリに制限します
  5. ユーザーの視点からテストする: 常に実際の SFTP ユーザーとしてテストして、パーミッションを確認します

まとめ

このチュートリアルでは、SFTP サーバーの設定、適切なパーミッションを持つユーザーの作成、および一般的なパーミッション拒否エラーのトラブルシューティングについて学びました。以下の実践的な経験を積みました。

  • Ubuntu で SFTP サーバーをインストールして設定する
  • Linux ファイルパーミッションとその SFTP アクセスへの影響を理解する
  • パーミッション拒否エラーを体験し、診断する
  • パーミッションの問題を解決するためのさまざまなソリューションを実装する
  • SFTP パーミッション管理のベストプラクティスを適用する

これらのスキルは、パーミッション関連の問題を最小限に抑えながら、安全な環境でファイル転送を効果的に管理するのに役立ちます。セキュリティ要件とユーザーアクセスニーズのバランスを取りながら、安全でありながら機能的な SFTP サーバーを維持するには、適切なパーミッション管理が不可欠であることを忘れないでください。