리눅스 SFTP 권한 거부 오류 문제 해결 방법

LinuxBeginner
지금 연습하기

소개

SFTP (Secure File Transfer Protocol) 는 네트워크를 통해 파일을 전송하기 위한 강력하고 안전한 솔루션입니다. 이 튜토리얼에서는 SFTP 를 이해하고, 'Permission Denied' 오류를 해결하며, Linux 시스템에서 SFTP 권한 문제를 해결하는 방법을 안내합니다. SFTP 서버를 설정하고, 적절한 권한을 가진 사용자를 생성하며, 파일 전송 중에 발생하는 일반적인 권한 문제를 진단하는 방법을 배우게 됩니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 88%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

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 에서 모든 파일과 디렉토리는 세 가지 유형의 권한을 갖습니다.

  • 읽기 (r): 파일 내용을 보거나 디렉토리 내용을 나열할 수 있습니다.
  • 쓰기 (w): 파일을 수정하거나 디렉토리에서 파일을 생성/삭제할 수 있습니다.
  • 실행 (x): 파일을 실행하거나 디렉토리에 접근할 수 있습니다.

이러한 권한은 세 가지 사용자 범주에 할당됩니다.

  • 소유자 (Owner): 파일을 생성한 사용자
  • 그룹 (Group): 파일에 할당된 그룹
  • 기타 (Others): 나머지 모든 사용자

현재 권한 보기

테스트 파일의 현재 권한을 확인해 보겠습니다.

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가 됩니다).
  • 다음 세 문자 rw-는 소유자 권한을 보여줍니다 (읽기, 쓰기, 실행 없음).
  • 다음 세 문자 rw-는 그룹 권한을 보여줍니다 (읽기, 쓰기, 실행 없음).
  • 마지막 세 문자 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 사용자가 접근할 수 있도록 테스트 파일 중 하나를 설정해 보겠습니다.

## 다른 사용자가 접근할 수 있는 디렉토리 생성
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: 파일 소유권 변경

또 다른 해결 방법은 파일의 소유권을 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

이 설정으로:

  • 메인 디렉토리는 모든 사용자가 읽고 실행할 수 있지만 소유자만 쓸 수 있습니다.
  • 업로드 하위 디렉토리는 모든 사용자가 쓸 수 있습니다 (SFTP 업로드에 적합).
  • sample.txt 파일은 모든 사용자가 읽을 수 있지만 소유자만 쓸 수 있습니다.

이 구성을 통해 SFTP 사용자는 다음을 수행할 수 있습니다.

  • 공유 디렉토리로 이동
  • 샘플 파일 읽기
  • 업로드 디렉토리에 파일 업로드

해결 방법 4: 더 세분화된 제어를 위해 ACL 사용

ACL (Access Control Lists, 접근 제어 목록) 은 보다 자세한 권한 관리를 제공합니다. 필요한 패키지를 설치하고 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
  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 서버를 유지하는 데 필수적이며, 보안 요구 사항과 사용자 접근 요구 사항의 균형을 맞추는 것을 기억하십시오.