SMB(Server Message Block) 서버는 파일, 프린터, 직렬 포트 및 통신 추상화를 위한 프로토콜을 제공하는 네트워크 파일 공유 프로토콜이다.
SMB는 주로 Windows 환경에서 파일 및 프린터 공유를 위해 사용되는데, Linux와 macOS 시스템에서도 사용할 수 있다.
SMB 서버를 통해 네트워크 상의 다른 컴퓨터는 공유된 자원에 접근할 수 있으며, 이는 네트워크 드라이브로 마운트하거나 파일 공유 접근을 통해 이루어진다. Linux 시스템에서는 Samba라는 소프트웨어를 통해 SMB 프로토콜을 구현할 수 있다. Samba는 Linux 및 유닉스 서버를 Windows 기반 클라이언트가 접근할 수 있는 파일 및 프린터 공유 서비스로 변화시키는 역할을 한다.
참고로 보안 문제로 인해 SMBv1은 더 이상 사용되지 않으며, SMBv2와 SMBv3 같은 더 안전한 버전이 권장된다.
SMB 서버를 설정할 때는 항상 최신 버전의 Samba를 사용하고, 적절한 보안 설정을 구성하는 것이 중요하다.
SMB는 클라이언트-서버 모델을 사용하여 작동한다. 클라이언트가 SMB 서버에 연결을 요청하고, 서버는 해당 요청을 승인하여 자원에 대한 접근을 허용한다.
이때, 보안을 위해 사용자 인증 절차를 거치며, 이는 주로 NTLM(NT LAN Manager)이나 Kerberos와 같은 프로토콜을 사용한다.
당연하게도 Ubuntu에서 SMB 서버를 구축하는 데 SSH(Secure Shell)는 필수적이지 않다. SMB(Server Message Block)와 SSH는 서로 다른 프로토콜이며, 각각 다른 목적으로 사용되기 때문이다.
SMB는 파일 공유를 위한 프로토콜이며, 원격으로 파일 시스템에 접근하거나 프린터 공유 등을 가능하게 한다.
반면, SSH는 주로 원격 시스템에 안전하게 접속하기 위한 프로토콜로, 명령줄 인터페이스를 통한 서버 관리에 사용된다.
그러나 SSH는 SMB 서버를 원격으로 설정하고 관리할 때 유용하다.
예를 들어, 원격 위치에서 Ubuntu 서버에 접속하여 Samba를 설치하고 설정 파일을 편집하는 등의 작업을 할 때 SSH 접속을 사용할 수 있다.
SSH를 통해 안전하게 서버에 접속하고 필요한 모든 설정 작업을 할 수 있기 때문에, 원격 관리를 위해서는 SSH가 매우 중요하다.
하지만 SSH 없이도 직접 또는 콘솔을 통해 서버에 물리적으로 접근하여 Samba를 설치하고 설정할 수 있다.
이 경우 SSH는 필요하지 않는다. SMB 서비스 자체가 작동하고 네트워크 상에서 파일 공유를 제공하는 데 SSH는 관련이 없다.
그리고 우리는 이 물리적으로 서버실에서 동작해보자.
클라이언트가 서버에 연결을 요청한다. 이때 TCP/IP
프로토콜을 사용하며, 일반적으로 TCP 포트 445 또는 이전 버전에서는 139를 사용한다.
서버가 클라이언트의 요청을 받아들이고, 서로 간에 SMB 프로토콜의 버전을 협상한다.
연결이 수립되면, 서버는 클라이언트의 요청을 받아들이고, 클라이언트는 사용자 이름과 비밀번호 같은 인증 정보를 제공한다. 서버는 이 정보를 검증하여 접근 권한을 부여한다. 이 과정에서는 NTLM(NT LAN Manager)
이나 Kerberos
같은 인증 방식이 사용될 수 있다.
클라이언트는 서버 상의 리소스에 대한 접근 권한을 갖게 된다.
인증 후, 클라이언트와 서버 간에 SMB 세션을 설정한다. 이때, 클라이언트는 서버에게 자신이 접근할 수 있는 리소스나 서비스의 리스트를 요청할 수 있고 파일이나 프린터와 같은 리소스에 대한 요청과 응답이 이루어진다.
세션이 설정되면, 클라이언트는 파일 열기, 읽기, 쓰기, 닫기 등의 요청을 서버에 보낼 수 있다.
리소스 요청: 클라이언트는 파일을 열거나 읽기/쓰기 등의 요청을 서버에 보낸다. 이때 해당 요청은 SMB 프로토콜을 사용하여 패킷으로 전송된다.
리소스 응답: 서버는 클라이언트의 요청을 처리하고, 요청된 작업을 실행한다. 그리고 그 결과를 클라이언트에게 다시 SMB 패킷으로 전송한다.
클라이언트는 응답받은 데이터를 사용하여 필요한 작업을 수행한다. 예를 들어, 파일을 로컬 시스템에 저장하거나, 문서를 출력하기 위해 프린터 공유에 접근할 수 있다.
작업이 끝나면, 클라이언트는 서버에게 세션을 종료하겠다는 요청을 보낸다.
서버는 이 요청을 수락하고 세션을 종료하면, 이후 연결이 끊어지며 모든 리소스가 해제된다.
sudo apt update
sudo apt install samba
설정을 변경하기 전에 기존의 Samba 설정 파일을 백업하는 것이 좋다.
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
설정 파일을 열어 공유할 디렉토리와 권한을 설정한다.
sudo nano /etc/samba/smb.conf
파일 맨 아래에 공유 설정을 추가한다. 예를 들어, files라는 이름의 공유를 생성하고 싶다면 다음과 같이 추가하면 된다.
[files]
path = <공유할 경로>
read only = no
browsable = yes
설정한 경로에 따라 디렉토리를 생성하고 적절한 권한을 부여해준다.
sudo mkdir -p /srv/samba/myshare
sudo chown nobody:nogroup /srv/samba/myshare
sudo chmod 0775 /srv/samba/myshare
Samba 사용자는 시스템 사용자와 연동되어 있어야 한다. 먼저 시스템 사용자를 추가하든 기존 사용자를 사용하든 괜찮다.
sudo adduser sambauser
그 다음 비밀번호를 Samba에 등록함으로서 사용자를 추가한다.
sudo smbpasswd -a sambauser
위 명령을 실행하면 비밀번호를 입력하라는 메시지가 나온다. Samba 접속용 비밀번호를 설정해주면 된다.
모든 설정을 마친 후 Samba 서비스를 재시작한다.
sudo systemctl restart smbd
Samba 서비스가 네트워크를 통해 접근 가능하도록 방화벽을 설정한다.
sudo ufw allow samba
혹은
sudo ufw allow 137/tcp
sudo ufw allow 138/tcp
sudo ufw allow 139/tcp
sudo ufw allow 445/tcp
설정확인 후 방화벽 재시작 후 로그 확인
sudo ufw status
sudo ufw reload
sudo ufw status verbose
서비스를 자동으로 시스템 부팅 시 시작하도록 설정하려면 다음 명령어를 사용하면 된다.
sudo systemctl enable smbd
Samba는 smbd 서비스로 실행되기 때문에, 다음 명령어로 상태를 확인할 수 있다.
sudo systemctl status smbd
Samba 서비스의 프로세스를 직접 확인하기 위해서는 ps 명령어를 사용할 수 있다.
ps -A | grep smbd
smbd 프로세스가 실행 중이면, 이 명령어의 출력에 프로세스 정보가 표시된다.
Samba가 네트워크 상에서 활성화되어 있는지 확인하기 위해 netstat 또는 ss 명령어를 사용하여 해당 포트가 열려 있는지 확인할 수 있다.
sudo netstat -tulnp | grep smbd
이때 netstat이 없다면 설치하면 되고 또는
sudo ss -tulnp | grep smbd
이 명령어들은 Samba가 사용하는 포트(기본적으로 TCP 139와 445)에 대한 정보를 보여준다.
smbd 서비스가 해당 포트에서 리스닝 중이라면 서비스가 실행 중인 것이다.
파일 탐색기 상단에 \\your_server_ip\files
를 통하여 접근할 수 있고 혹은 win + r
을 통해 \\your_server_ip\files
로 접근할 수 있다.
Finder의 '서버에 연결' 기능을 사용하여 smb://your_server_ip/myshare로 접근할 수 있다.