SMB(Server Message Block) 네트워크 프로토콜은 TCP 445 포트를 통해 네트워크상의 폴더, 파일, 프린터 및 기타 장치를 공유하고 접근할 때 사용됩니다. 이 글에서는 다양한 Windows 버전에서 지원되는 SMB 버전(다이얼렉트)의 종류와 Linux의 Samba 버전과의 관계, 현재 사용 중인 SMB 버전을 확인하는 방법, 그리고 SMBv1, SMBv2, SMBv3를 활성화하거나 비활성화하는 방법까지 자세히 알아보겠습니다.
목차
- Windows의 SMB 프로토콜 버전
- Windows에서 SMB 버전 확인 방법
- Get-SMBConnection으로 사용 중인 SMB 다이얼렉트 확인하기
- 안전하지 않은 SMBv1 프로토콜 사용 중단하기
- Windows에서 SMBv1, SMBv2, SMBv3 활성화 및 비활성화 방법
Windows의 SMB 프로토콜 버전
SMB 프로토콜은 여러 버전(다이얼렉트)이 있으며, 새로운 Windows(및 Samba) 버전이 출시될 때마다 지속적으로 추가되어 왔습니다.
- CIFS – Windows NT 4.0
- SMB 1.0 – Windows 2000
- SMB 2.0 – Windows Server 2008, Windows Vista SP1 (Samba 3.6에서 지원)
- SMB 2.1 – Windows Server 2008 R2, Windows 7 (Samba 4.0)
- SMB 3.0 – Windows Server 2012, Windows 8 (Samba 4.2)
- SMB 3.02 – Windows Server 2012 R2, Windows 8.1 (Samba 미지원)
- SMB 3.1.1 – Windows Server 2016, Windows 10 (Samba 미지원)
Linux/Unix 환경에서는 Samba가 SMB 프로토콜을 구현합니다. Samba 4.14 이상 버전은 기본적으로 SMB 2.1을 사용합니다.
SMB 네트워크 통신에서 클라이언트와 서버는 양쪽 모두가 지원하는 최대 SMB 프로토콜 버전을 사용합니다.
SMB 버전 호환성 요약표
아래 표를 통해 서로 다른 Windows 버전 간에 통신할 때 어떤 SMB 프로토콜 버전이 선택되는지 확인할 수 있습니다.
| 운영체제 | Win 10 / Server 2016 | Win 8.1 / Server 2012 R2 | Win 8 / Server 2012 | Win 7 / Server 2008 R2 | Vista / Server 2008 | XP / Server 2003 이하 |
|---|---|---|---|---|---|---|
| Windows 10, Server 2016 | SMB 3.1.1 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows 8.1, Server 2012 R2 | SMB 3.02 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows 8, Server 2012 | SMB 3.0 | SMB 3.0 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows 7, Server 2008 R2 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows Vista, Server 2008 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 1.0 |
| Windows XP, Server 2003 이하 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 |
예를 들어, Windows 8.1 클라이언트가 Windows Server 2016 파일 서버에 접속하면 SMB 3.02 프로토콜이 사용됩니다.
표에서 볼 수 있듯이, Windows XP와 Windows Server 2003은 공유 폴더와 파일에 접근할 때 SMB 1.0만 사용할 수 있습니다. 그런데 최신 Windows Server(2012 R2/2016)에서는 SMBv1이 기본적으로 비활성화되어 있습니다. 따라서 네트워크에 아직 Windows XP나 Windows Server 2003 장치가 남아 있다면, 해당 장치들은 Windows Server 2016 파일 서버의 공유 폴더에 접근할 수 없습니다.
SMB v1.0이 비활성화된 Windows Server 2019/2016이 도메인 컨트롤러로 사용되는 경우, Windows XP/Server 2003 클라이언트는 도메인 컨트롤러의 SYSVOL과 NETLOGON 폴더에 접근할 수 없고 AD 인증도 불가능합니다.
SMBv1이 비활성화된 파일 서버의 공유 폴더에 접속을 시도하면 다음과 같은 오류가 발생할 수 있습니다.
지정한 네트워크 이름을 더 이상 사용할 수 없습니다
(The specified network name is no longer available)
Windows에서 SMB 버전 확인 방법
이제 자신의 Windows 장치에서 어떤 SMB 버전이 활성화되어 있는지 확인하는 방법을 살펴보겠습니다.
Windows 10/8.1, Windows Server 2019/2016/2012R2에서 확인
PowerShell을 사용하여 SMB 프로토콜의 각 다이얼렉트 상태를 확인할 수 있습니다.
Get-SmbServerConfiguration | select EnableSMB1Protocol,EnableSMB2Protocol명령 실행 결과 SMB1 프로토콜이 비활성화(EnableSMB1Protocol = False)되어 있고, SMB2와 SMB3 프로토콜은 활성화(EnableSMB2Protocol = True)되어 있다면 그렇게 해석하시면 됩니다.
참고: SMBv3와 SMBv2는 긴밀하게 연관되어 있습니다. SMBv3 또는 SMBv2를 개별적으로 활성화/비활성화할 수 없으며, 동일한 스택을 공유하기 때문에 항상 함께 켜거나 꺼야 합니다.
Windows 7, Vista, Windows Server 2008 R2/2008에서 확인
구버전 Windows에서는 레지스트리를 통해 확인합니다.
Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $_.pspath}해당 레지스트리 키에 SMB1 또는 SMB2라는 매개변수가 없다면, SMBv1과 SMBv2 프로토콜이 기본값으로 활성화되어 있는 것입니다.
또한 이러한 Windows 버전에서는 원격 호스트에 접속할 때 허용되는 SMB 클라이언트 다이얼렉트도 확인할 수 있습니다.
sc.exe query mrxsmb10SERVICE_NAME: mrxsmb10
TYPE : 2 FILE_SYSTEM_DRIVER
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
sc.exe query mrxsmb20SERVICE_NAME: mrxsmb20
TYPE : 2 FILE_SYSTEM_DRIVER
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
두 서비스 모두 실행 중(STATE = 4 Running)이라면, 현재 Windows 장치가 SMBv1과 SMBv2 호스트 모두에 접속할 수 있다는 의미입니다.
Get-SMBConnection으로 사용 중인 SMB 다이얼렉트 확인하기
SMB 통신 시 컴퓨터는 클라이언트와 서버 양쪽이 지원하는 최대 SMB 버전을 사용합니다. 원격 컴퓨터에 접속할 때 실제로 사용되는 SMB 버전은 PowerShell의 Get-SMBConnection cmdlet으로 확인할 수 있습니다.
원격 서버(ServerName)에 접속할 때 사용되는 SMB 버전은 Dialect 열에 표시됩니다.
특정 서버에 접속할 때 사용되는 SMB 버전 정보만 출력하려면 다음 명령을 사용합니다.
Get-SmbConnection -ServerName srvfs01SMB 암호화(SMB 3.0부터 도입) 사용 여부를 확인하려면 아래 명령을 실행합니다.
Get-SmbConnection | ft ServerName,ShareName,Dialect,Encrypted,UserNameLinux(Samba)에서 확인
Linux에서는 다음 명령으로 SMB 연결 목록과 사용 중인 다이얼렉트를 확인할 수 있습니다.
$ sudo smbstatusSMB 서버 측에서 클라이언트 버전 확인
Windows SMB 서버 측에서는 현재 클라이언트들이 사용 중인 SMB 프로토콜 버전 목록을 출력할 수 있습니다. 다음 명령을 실행합니다.
Get-SmbSession | Select-Object -ExpandProperty Dialect | Sort-Object -Unique예를 들어, 898개의 클라이언트가 SMB 2.1(Windows 7/Windows Server 2008 R2)로, 8개의 클라이언트가 SMB 3.02로 서버에 연결되어 있는 식으로 확인할 수 있습니다.
PowerShell을 사용하여 접속에 사용된 SMB 버전 감사(auditing)를 활성화할 수도 있습니다.
Set-SmbServerConfiguration –AuditSmb1Access $true이후 이벤트 뷰어 로그에서 SMB 접속 이벤트를 내보낼 수 있습니다.
Get-WinEvent -LogName Microsoft-Windows-SMBServer/Audit안전하지 않은 SMBv1 프로토콜 사용 중단하기
지난 몇 년간 Microsoft는 보안상의 이유로 모든 제품에서 구형 SMB 1.0 프로토콜을 체계적으로 비활성화해 왔습니다. 이 프로토콜에는 수많은 치명적인 취약점이 존재하기 때문입니다(WannaCry, Petya 랜섬웨어 사태가 SMBv1 취약점을 악용한 대표적인 사례입니다). Microsoft와 여러 IT 기업들은 네트워크에서 SMBv1 사용을 중단할 것을 강력히 권장하고 있습니다.
다만 SMBv1을 비활성화하면 구형 클라이언트(Windows XP, Windows Server 2003), 타사 운영체제(Mac OSX 10.8 Mountain Lion, Snow Leopard, Mavericks, 구형 Linux 배포판), 구형 NAS 장치 등에서 최신 Windows 10(Windows Server 2016/2019)의 공유 파일 및 폴더에 접근할 때 문제가 발생할 수 있습니다.
네트워크에 SMBv1만 지원하는 구형 장치가 더 이상 남아 있지 않다면, 반드시 이 SMB 다이얼렉트를 비활성화하시기 바랍니다.
반대로 Windows XP, Windows Server 2003 등 SMBv1만 지원하는 클라이언트가 여전히 있다면, 업그레이드하거나 네트워크에서 격리해야 합니다.
Windows에서 SMBv1, SMBv2, SMBv3 활성화 및 비활성화 방법
이제 Windows에서 각 SMB 버전을 활성화하고 비활성화하는 방법을 알아보겠습니다. SMB 클라이언트와 서버는 서로 다른 Windows 구성 요소이므로 각각 관리할 수 있습니다.
Windows 10, 8.1, Windows Server 2019/2016/2012R2
SMBv1 클라이언트 및 서버 비활성화:
Disable-WindowsOptionalFeature -Online -FeatureName smb1protocolSMBv1 서버만 비활성화:
Set-SmbServerConfiguration -EnableSMB1Protocol $falseSMBv1 클라이언트 및 서버 활성화:
Enable-WindowsOptionalFeature -Online -FeatureName smb1protocolSMBv1 서버만 활성화:
Set-SmbServerConfiguration -EnableSMB1Protocol $trueSMBv2 및 SMBv3 서버 비활성화:
Set-SmbServerConfiguration -EnableSMB2Protocol $falseSMBv2 및 SMBv3 서버 활성화:
Set-SmbServerConfiguration -EnableSMB2Protocol $trueWindows 7, Vista, Windows Server 2008 R2/2008
SMBv1 서버 비활성화:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 –ForceSMBv1 서버 활성화:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 –ForceSMBv1 클라이언트 비활성화:
sc.exe config lanmanworkstation depend= bowser/mrxsmb20/nsi
sc.exe config mrxsmb10 start= disabledSMBv1 클라이언트 활성화:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb10 start= autoSMBv2 서버 비활성화:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 0 -ForceSMBv2 서버 활성화:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 1 –ForceSMBv2 클라이언트 비활성화:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/nsi
sc.exe config mrxsmb20 start= disabledSMBv2 클라이언트 활성화:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb20 start= autoGPO를 통한 대량 적용
도메인에 가입된 컴퓨터들에서 SMBv1 서버를 일괄 비활성화하려면 GPO(그룹 정책)를 통해 다음 레지스트리 매개변수를 배포하면 됩니다.
- 키: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
- 이름: SMB1
- 유형: REG_DWORD
- 값: 0
SMBv2 서버를 비활성화하려면 레지스트리 매개변수 SMB2=0을 설정합니다.
SMBv1 클라이언트를 비활성화하려면 다음 레지스트리 설정을 배포합니다.
- 키: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\mrxsmb10
- 이름: Start
- 유형: REG_DWORD
- 값: 4
주의: Windows에서 SMB 1.0/CIFS 파일 공유 지원을 비활성화할 때 0x80070035(네트워크 경로를 찾을 수 없음) 오류가 발생하거나, 공유 폴더 접근 오류, 네트워크 검색 문제가 나타날 수 있습니다. 이 경우 Computer Browser 서비스 대신 Discovery Service(Function Discovery Provider Host 등)를 사용해야 합니다.