FTP 프로토콜은 무려 40년이 넘은 역사를 가진 오래된 프로토콜이지만, 간단한 파일 전송만 필요한 환경에서는 지금도 폭넓게 사용되고 있습니다. Microsoft 운영체제라면 어떤 버전에서든 FTP 서버를 설치할 수 있으며, FTP 서비스의 마지막 대대적인 개편은 Windows 7 / Server 2008 R2에서 이루어졌습니다(사실상 서비스 코드가 처음부터 새로 작성되었습니다). 이를 통해 서비스 보안성이 크게 향상되었고 다양한 신규 기능이 추가되었습니다. 그중 대표적인 기능이 바로 FTP 사용자 격리(FTP User Isolation)입니다. 이 기능을 사용하면 하나의 FTP 서버에서 여러 사용자가 각자 자신의 폴더에만 접근하도록 제한할 수 있습니다.
FTP 사용자 격리란 무엇인가?
사용자 격리가 적용되면 각 사용자는 자신의 폴더에서만 작업할 수 있고, FTP 디렉터리 트리의 상위로 이동할 수 없습니다(사용자에게는 자신의 최상위 FTP 디렉터리가 FTP 서버의 루트로 표시됩니다). 따라서 FTP 서버에 저장된 다른 사용자의 데이터에 접근하는 것을 원천적으로 차단할 수 있습니다. 이러한 특성 덕분에 FTP 사용자 격리는 ISP나 호스팅 업체가 하나의 파일 스토리지에 대해 사용자별 개별 접근 권한을 제공해야 할 때 널리 활용됩니다.
이전 버전의 Windows와 마찬가지로 Windows Server 2016 / 2012 R2의 FTP 서비스(sFTP나 TFTP와 혼동하지 마세요)는 IIS 서비스에 깊이 통합되어 있으며, 하나의 통합 관리 콘솔을 통해 관리할 수 있습니다.
이 글에서는 Windows Server 2016/2012 R2에 IIS 기반 FTP 서버를 설치하고 FTP 사용자 격리를 구성하는 방법을 단계별로 살펴보겠습니다(Windows 10 및 8.1에도 동일하게 적용됩니다).
Windows Server 2016/2012 R2에 FTP 서버 역할 설치하기
서버 관리자(Server Manager) 콘솔을 열고 웹 서버(IIS) → FTP 서버 섹션에서 FTP Service와 FTP Extensibility 옵션을 체크하면 FTP 서비스를 설치할 수 있습니다.

또는 PowerShell 명령 한 줄로 FTP 서버 역할을 설치할 수도 있습니다.Install-WindowsFeature Web-FTP-Server
FTP 서버 관리 콘솔까지 함께 설치하려면 아래 명령을 실행하세요.
Install-WindowsFeature -Name "Web-Mgmt-Console"
FTP 사이트 생성 및 사용자 권한 관리
서버 관리자를 실행하고 IIS 관리 콘솔(Internet Information Services Manager)을 엽니다.

새 FTP 사이트를 생성합니다(Sites → Add FTP Site).

- FTP 사이트 이름: MyTestSite
- FTP 사이트 루트 디렉터리: C:\inetpub\ftproot

네트워크를 통해 전송되는 FTP 데이터를 보호하려면 FTP에 SSL을 적용할 수 있습니다(이 경우 세션 중에 FTP 사용자가 전송하는 모든 데이터와 계정·비밀번호가 암호화됩니다). 다만 본 예제에서는 SSL 설정이 필수적이지 않으므로 생략하고 나머지 설정은 기본값으로 유지합니다.
PowerShell의 WebAdministration 모듈을 사용해서도 FTP 사이트를 관리할 수 있습니다. 예를 들어 새 FTP 사이트를 만들려면 다음 명령을 실행하면 됩니다.
Import-Module WebAdministration
# FTP 사이트 이름 지정
$FTPSiteName = 'CORP_FTP'
# FTP 폴더
$FTPRoot = 'D:\www\FTPRoot'
# FTP 포트
$FTPPort = 21
New-WebFtpSite -Name $FTPSiteName -PhysicalPath $FTPRoot -Port $FTPPort
새로 만든 FTP 사이트를 선택한 후 FTP Authentication 섹션에서 익명 인증(Anonymous Authentication)을 비활성화하고, 기본 인증(Basic Authentication)은 반드시 활성화합니다.

Windows Server 2016/2012 R2의 FTP 서비스는 도메인 계정과 로컬 계정 두 가지 유형을 사용할 수 있습니다. 계정 유형에 따라 FTP 디렉터리 구조와 사용자 격리 설정에 차이가 있으므로, 설명의 편의를 위해 여기서는 로컬 Windows 계정을 사용하겠습니다.
먼저 FTP 사용자를 몇 명 생성합니다. 예를 들어 ftp_user1, ftp_user2, ftp_user3 세 명을 만들고, 이들을 포함하는 ftp_users 그룹을 생성합니다. 로컬 사용자는 컴퓨터 관리(Computer Management) 콘솔의 로컬 사용자 및 그룹 섹션에서 만들 수 있습니다.

명령 프롬프트나 PowerShell을 통해서도 로컬 사용자와 그룹을 생성할 수 있습니다. 먼저 로컬 그룹을 만듭니다.net localgroup ftp_users /add
새 로컬 사용자를 생성합니다.net user ftp_user1 /add *
생성한 사용자를 그룹에 추가합니다.net localgroup ftp_users ftp_user1 /add
나머지 두 사용자도 같은 방식으로 생성합니다.
그다음 C:\inetpub\ftproot 디렉터리에 대해 ftp_users 그룹에 읽기 및 쓰기 권한을 부여합니다.

C:\inetpub\ftproot 폴더 안에 반드시 LocalUser라는 이름의 디렉터리를 생성합니다(이름이 정확히 일치해야 합니다. 매우 중요합니다!!!). 그런 다음 C:\inetpub\ftproot\LocalUser 하위에 ftp_user1, ftp_user2, ftp_user3라는 이름의 디렉터리를 각각 만듭니다.
참고. 계정 유형에 따라 다음과 같은 디렉터리 구조를 만들어야 합니다(%FtpRoot%는 FTP 사이트의 루트를 의미하며, 본 예제에서는 C:\inetpub\ftproot\입니다).
| 계정 유형 | 홈 디렉터리 명명 규칙 |
| 익명 사용자 | %FtpRoot%\LocalUser\Public |
| 로컬 Windows 계정 | %FtpRoot%\LocalUser\%UserName% |
| 도메인 Windows 계정 | %FtpRoot%\%UserDomain%\%UserName% |
| 특수 IIS 관리자 또는 ASP.NET 계정 | %FtpRoot%\LocalUser\%UserName% |

IIS 콘솔로 돌아가 사이트의 FTP Authorization Rules 섹션에서 새 규칙(Add AllowRules)을 생성합니다. ftp_users 그룹에 읽기 및 쓰기 권한을 허용하도록 지정합니다.

Windows Server 2016/2012 R2에서 FTP 사용자 격리 구성하기
이제 FTP 사용자 격리를 구성해 보겠습니다. 사용자 격리는 서버 전체가 아니라 FTP 사이트 수준에서 설정한다는 점에 유의하세요. FTP 사용자 격리를 통해 사용자별 FTP 홈 폴더를 체계적으로 구성할 수 있습니다.
FTP 사이트 설정에서 FTP User Isolation 항목을 엽니다.
이 화면에는 여러 가지 설정 옵션이 있으며, 앞의 두 가지는 사용자 격리를 적용하지 않는 모드입니다.
- FTP root directory (사용자의 FTP 세션이 FTP 사이트의 루트 디렉터리에서 시작됨);
- User name directory (사용자 이름과 동일한 물리적/가상 디렉터리에서 세션이 시작되며, 해당 디렉터리가 없으면 사이트의 FTP 루트 디렉터리에서 시작됨).
나머지 세 가지 옵션은 서로 다른 사용자 격리 모드입니다.
- User name directory (disable global virtual directories): 사용자의 FTP 세션이 FTP 사용자 이름과 동일한 물리적/가상 디렉터리 내에서 격리됩니다. 사용자는 자신의 디렉터리(즉, 자신의 FTP 루트 디렉터리)만 볼 수 있으며 그 밖의 상위 디렉터리로 이동할 수 없습니다. 모든 전역 가상 디렉터리는 무시됩니다;
- User name physical directory (enable global virtual directories): 사용자의 FTP 세션이 FTP 계정 이름과 동일한 물리적 디렉터리 내에서 격리됩니다. 사용자는 자신의 디렉터리 위로 올라갈 수 없지만, 생성된 모든 전역 가상 디렉터리에는 접근할 수 있습니다;
- FTP home directory configured in Active Directory: FTP 사용자가 Active Directory 계정 설정에 지정된 홈 디렉터리(FTPRoot 및 FTPDir 속성) 내에서 격리됩니다.
중요. 전역 가상 디렉터리가 활성화되어 있으면, 적절한 NTFS 권한이 있는 경우 모든 사용자가 FTP 사이트 루트에 설정된 모든 가상 디렉터리에 접근할 수 있습니다.

필요한 격리 모드를 선택합니다(여기서는 두 번째 옵션으로 FTP 사용자를 격리했습니다).
FTP 사이트 설정을 변경할 때마다 Microsoft FTP 서비스(FTPSVC)를 재시작하는 것이 좋습니다.
FTP 서버 접근을 위한 Windows 방화벽 규칙 구성
FTP 서버 역할을 설치하면 사용자가 FTP에 접근하는 데 필요한 방화벽 규칙들이 Windows 방화벽 설정에 자동으로 활성화됩니다.
패시브(passive) FTP 모드에서 정상적으로 동작하려면 사용자가 RPC 포트 범위(1025~65535)에 연결할 수 있어야 합니다. 외부 방화벽에서 이 모든 포트를 여는 대신, FTP 데이터 전송에 사용되는 동적 TCP 포트 범위를 제한할 수 있습니다.
- FTP 사이트 설정에서 FTP Firewall Support 섹션을 열고 Data Channel Port Range 필드에 FTP 연결에 사용할 포트 범위를 지정합니다. 예: 50000-50100;

- 변경 사항을 저장하고 IIS를 재시작합니다(
iisreset); - Windows 제어판을 열고 제어판\시스템 및 보안\Windows 방화벽\앱 허용으로 이동합니다;
- 방화벽을 통한 접근이 허용된 앱 목록에 FTP Server 역할에 대한 허용 권한이 포함되어 있는지 확인합니다.

그다음 고급 보안이 포함된 Windows 방화벽 설정에서 다음 규칙들이 활성화되어 있는지 확인합니다.
- FTP Server (FTP Traffic-In) – TCP 프로토콜, 포트 21;
- FTP Server Passive (FTP Passive Traffic-In) – 로컬 포트 1024-65535(본 예제에서는 50000-50100);
- FTP Server Secure (FTP SSL Traffic-In) – 포트 990(SSL을 사용하는 FTP의 경우);
- FTP Server (FTP Traffic-Out) – 포트 20;
- FTP Server Secure (FTP SSL Traffic-Out) – 포트 989(SSL을 사용하는 FTP의 경우).

외부 FTP 사용자가 사이트에 접속할 수 있도록 하려면 해당 포트들을 공유기(게이트웨이, 방화벽)에서도 열어 주어야 합니다.
Windows에서 FTP 서버 연결 테스트하기
Test-NetConnection cmdlet을 사용하여 FTP 서버의 포트 개방 여부를 확인할 수 있습니다.
Test-NetConnection -ComputerName yourftpservername -Port 21
또는 ftp 명령을 사용할 수도 있습니다.
ftp yourftpservername
FTP 클라이언트 또는 파일 탐색기 주소창에 직접 ftp://yourservername/ 을 입력하여 FTP 사이트에 접속해 보세요.
사용자 이름과 비밀번호를 입력합니다.

이제 사용자 파일이 담긴 홈 디렉터리(사용자 입장에서는 FTP 사이트의 루트)에 접근할 수 있습니다. 사용자 세션이 격리되어 있어 FTP 서버에서 자신의 파일만 보이는 것을 확인할 수 있습니다.

팁. 익명 접근(모든 익명 사용자)을 허용하면 누구나 사용자 이름에 anonymous 또는 guest, 비밀번호에 이메일 주소를 입력하여 FTP 서버에 접속할 수 있습니다. 익명으로 FTP 사이트에 접속하면 세션은 LocalUser\Public 디렉터리로 제한됩니다(당연히 Public 디렉터리는 미리 생성되어 있어야 합니다).
FTP 로그를 활용하면 FTP 서버에 대한 사용자 접근 정보를 확인할 수 있습니다. 로그 파일은 기본적으로 c:\inetpub\logs\logfiles 폴더에 u_exYYMMDD.log 형식으로 저장됩니다.
현재 FTP 서버에 접속 중인 사용자 연결을 확인하려면 PowerShell을 통해 IIS 성능 카운터 값을 조회하거나, IIS 콘솔의 "Current FTP Sessions(현재 FTP 세션)" 섹션을 사용할 수 있습니다. 이 콘솔에서는 FTP 사용자의 이름과 IP 주소를 확인할 수 있고, 필요하다면 해당 FTP 세션을 강제로 종료할 수도 있습니다.

지금까지 Windows Server 2016 / 2012 R2 기반으로 사용자 격리가 적용된 FTP 사이트를 구성하는 방법을 알아보았습니다. 격리 모드에서는 사용자가 로컬 또는 도메인 자격 증명으로 FTP에 인증되며, 사용자 이름에 해당하는 자신의 루트 디렉터리에만 접근할 수 있습니다.