리눅스

Total 331
Today 0
profile_image
윤진한
06-12-26 10:31 0개 12회
TIP
Samba 공유자원의 사용자별 접권 권한 콘트
리눅스 머신에서 samba를 이용하여 임의의 디렉터리를 공유하고자
할 때 이 디렉터리에 대한 사용자 별 접권 권한을 어떻게 조절할 수
있는지 그 방법을 알아보고자 합니다.

데비안 2.2 POTATO, samba 2.0.5, 2.0.6, 2.0.7에서 시험하였습니
다.


samba를 설치한 후에 smb.conf 예를 살펴보면 아래와 같은 설정이
있습니다.

[public]
comment = Public Stuff
path = /usr/somewhere/public
public = yes
writable = no
printable = no
write list = @staff

위 설정의 의미는 다음과 같습니다.

"/usr/somewhere/public 이라는 디렉터리의 공유 이름을 public
으로 하여 누구나 접근 할 수는 있지만 (public = yes), 파일을
쓸 수는 없도록 (writable = no) 설정한다. 다만, staff 그룹에
속하는 사용자에 한해서는 쓰기도 가능하다."

그러나 위의 설정은 제대로 작동하지 않음을 확인하였습니다. 위의
설정을 크게 바꾸지 않는 범위에서 할 수 있는 짓은 다 해 보았으나
통하지를 않았습니다. samba 메일링 리스트는 현재 온라인 서치가
작동하지 않아서 그 쪽의 도움은 받을 수가 없었습니다.

NOTE: 위의 설정이 제대로 작동하는 것을 확인하신 분은 저에게 알려
주시면 감사하겠습니다.

writable = no 라는 설정의 위력은 대단합니다. 비록 공유하고자
하는 디렉터리를 777 모드로 설정해 놓아도 전혀 쓰기를 할 수가
없었습니다. 심지어 그 디렉터리의 소유자 ID로도 읽기 만을 할 수
있을 뿐 이었습니다.

writable = yes 라고 설정해 놓고 디렉터리를 777 모드로 설정해
놓으면 모든 사용자가 읽고 쓸 수 있는 권한을 가지게 됩니다. 전혀
원하는 바가 아니지요. 775로 설정해 놓으면 읽기 만이 가능합니다.

어쩔 수 없이 public = yes를 포기했습니다. 즉 누구나 비밀번호
입력 없이 읽을 수 있도록 하고 특정 사용자들에게만 쓰기 권한을
주는 설정은 불가능하다고 결론을 내렸습니다. 그래서 비밀 번호를
입력해서 접근 할 수 있도록 설정을 바꾸고 각 사용자 별로 접근
권한을 조절하는 방안을 찾기로 하였습니다.

우선 아래와 같이 설정을 바꾸었습니다.

[public]
comment = Public Stuff
browseable = yes
path = /usr/somewhere/public
writable = yes
read list = tiyo
write list = momo

위의 설정에서 tiyo와 momo는 리눅스 머신에 실제로 존재하는 즉,
/etc/passwd 파일에 있는 user ID 입니다. 또한, smbpasswd 파일에
등록되어 있는 것은 물론 입니다. read list와 write list에 다른
사용자를 추가하려면 콤마로써 구분해 주면 됩니다.

위의 설정은 제대로 작동하는 것으로 확인 되었습니다. 윈도 머신에서
tiyo로 로그온 한다면 리눅스 쪽의 공유 디렉터리를 읽을 수 있습니다.
물론 쓸 수는 없지요. momo로 로그온 한다면 읽고 쓰기 모두
가능합니다.

그런데, 위의 설정은 조금 문제가 있습니다. smbpasswd 파일에 tiyo와
momo 이외의 사용자 등록되어 있다면, 그 사용자가 비록 read list와
write list에 없다고 하더라도 일고 쓸 수가 있다는 것입다. 이는
writable = yes 대신에 writable = no라고 설정해 주면 해결되는 문제
입니다. 따라서 정확한 설정은 다음과 같습니다.

[public]
comment = Public Stuff
browseable = yes
path = /usr/somewhere/public
writable = no
read list = tiyo
write list = momo

이제 남은 문제는 윈도 머신 사용자들의 로그온 ID를 리눅스 머신의
실제 user ID로 등록하지 않고도 그들의 접권 권한을 조절해야 한다는
것 입니다. 이를 해결하기 위한 방법은 user map 파일을 만드는 것
입니다.

[global] 섹션에 아래와 같은 설정을 넣어 줍니다.

username map = /etc/samba/users.map

그리고 users.map 파일을 작성합니다. 예를 들면 아래와 같습니다.

tiyo = jaff kei moss
momo = pei gress klee

위에서 tiyo와 momo는 리눅스 머신의 실제 사용자 ID 이며, jaff,
kei, pei등은 윈도 머신에서 사용하는 로그온 ID 입니다. 물론,
등호(=)의 오른쪽에 있는 사용자 목록에는 리눅스 머신의 사용자 ID도
올 수 있으며 그룹 ID(예, @staff)도 올 수 있습니다.

또한, global 섹션에 encrypt passwords = yes를 설정해 놓았다면
tiyo와 momo의 비밀번호가 /etc/samba/smbpasswd 파일에 등록되어
있어야 할 것입니다.

위와 같이 user map 파일을 만들어 사용할 때, 윈도 머신에서 pei라는
ID로 리눅스 머신에 접근한다면 momo 사용자의 홈 디렉터리에도 접근
할 수 있다는 문제점이 있습니다. 이 문제를 피하기 위해서는 [home]
섹션을 제거하는 것이 가장 좋을 것으로 생각됩니다.

[public] 섹션으로 돌아가서, valid users = tiyo momo 설정을 추가

줄 필요는 없습니다. read list 와 write list 설정으로도 충분합니
다.
그 다음, 중요한 것은 공유하고자 하는 디렉터리의 소유자가 누구냐
하는 것 입니다. 두 말할 필요도 없이 쓰기 권한을 줄 momo가 그
소유자가 되어야 할 것입니다. 755 모드로 공유 디렉터리를 설정해
두면 되겠습니다. 또는, 소유자를 nobody, 소유 그룹을 nogroup으로
지정하고 아래 두 줄을 추가해 두는 것도 괜찮을 듯 합니다.

force user = nobody
force group = nogroup


정리를 해 보면,

1. 쓰기 권한과 읽기 권한을 줄 사용자 ID를 만든다

# adduser tiyo
# adduser momo


2. encrypt password를 사용할 경우에는 read list와 write list에
열거된 사용자들의 ID와 패스워드를 smbpasswd 파일에 등록한다.

# smbpasswd -a tiyo
# smbpasswd -a momo

3. 쓰기 권한을 줄 사용자 명의로 공유할 디렉터리를 만든다.

# cd /
# mkdir pub
# chown tiyo.tiyo pub
# chmod 755 pub

4. users.map 파일을 만들어 /etc/samba/ 디렉터리에 저장한다. 파일
이름과 저장 위치는 원하는 대로......

5. smb.conf 파일의 global 섹션에 아래 한 줄을 추가

[global]
........
........
........
username map = /etc/samba/users.map
........
........

6. smb.conf 파일에 공유할 디렉터리를 정의한다.


[public]
comment = Public Stuff
browseable = yes
path = /pub
writable = no
; directory mode = 0777 필요에 따라 추가
; force user = nobody 필요에 따라 추가
; force group = nogroup 필요에 따라 추가
read list = tiyo
write list = momo

7. samba를 데몬으로 실행시키고 있다면 다시 실행시킨다.


여러 디렉터리를 사용자 접근 권한을 각각 달리하여 적용하고자
한다면 리눅스 머신의 사용자 ID를 여러개 만들어야 한다는 사소한
불편함이 있다는 것이 불만이라면 불만입니다. 여러 디렉터리에
실제로 적용을 해 보지는 않았습니다.

위의 사항을 여러 디렉터리에 적용을 하였더니 문제가 있었습니다.
가령, 다음과 같은 user map 파일을 만들었다고 가정하겠습니다.

tiyo = jaff kei moss
momo = pei gress klee
kozi = pei klee moss
mimi = jaff gress moss

그리고 아래와 같이 두개의 공유 디렉터리를 정의 하겠습니다.


[public1]
comment = Public Stuff
browseable = yes
path = /pub1
writable = no
read list = tiyo
write list = momo

[public2]
comment = Public Stuff
browseable = yes
path = /pub2
writable = no
read list = kozi momo
write list = mimi

pei라는 윈도우 사용자를 놓고 한 번 생각해 보겠습니다.
위 설정의 의도는 pei는 public1에 쓰기 권한을 주고, public2에는
읽기 권한만을 부여하겠다는 것 입니다. 그런데 묘하게도 뜻대로
되지는 않았습니다. pei라는 사용자는 public2에 쓰기까지 할 수
있었습니다.

Note : 단지 예를 들기 위한 설정이기 때문에 위의 설정대로 하여도
설명과 같지 않을 수 있습니다.

묘한 상황이긴 하지만 어떻게 할 수가 없었습니다. 이렇게 된 이유는
아마도 samba가 시작될 때 username map 파일을 먼저 읽어 들이기
때문이라고 추측할 뿐 입니다. 시험해 보면 꼭 그것 때문이라고 할
수도 없기는 하지만.... 버그가 있지 않나라고 생각합니다.

해결책은 모든 윈도우 사용자 ID를 리눅스 머신의 사용자 ID로 등록해
주고 그 ID를 read list와 write list에 등록해 주는 수 밖에
없었습니다. 어쨌든 해결책은 있는 셈이네요.

댓글목록

등록된 댓글이 없습니다.