로컬 네트워크에만 공유를 제공하는 Samba(버전 4.15.13-Ubuntu)를 실행하는 간단한 홈 Ubuntu 서버가 있습니다. 목적은 Unix 사용자를 "sambashare" 그룹에 할당하고 Samba 사용자가 게스트 액세스가 아닌 이 Unix 그룹의 구성원인 경우에만 공유에 대한 액세스를 허용하는 것입니다. 또한 사용자는 세션 중에 Unix 그룹 "sambashare"에 강제로 가입해야 모든 파일/디렉토리가 해당 그룹의 소유로 유지되므로 모든 "sambashare" 사용자가 읽고 쓸 수 있습니다.
smb 구성 파일
[global]
server string = Samba
client min protocol = SMB3
server min protocol = SMB2
security = user
max log size = 1000
smb ports = 445
log level = 3
server role = standalone server
map to guest = bad user
; options to allow iOS devices
fruit:delete_empty_adfiles = yes
fruit:veto_appledouble = no
fruit:posix_rename = yes
fruit:wipe_intentionally_left_blank_rfork = yes
vfs objects = fruit streams_xattr
fruit:model = MacSamba
fruit:nfs_aces = no
fruit:metadata = stream
[%h]
path = /samba/share
valid users = @sambashare
browseable = yes
writeable = yes
public = no
force group = +sambashare
create mask = 660
force create mode = 660
directory mask = 770
force directory mode = 770
공유 디렉터리에 대한 권한은 using chgrp -R sambashare share
and 로 설정되어 chmod -R 770 /samba/share
디렉터리와 그 안의 모든 항목이 올바른 그룹을 상속합니다.
ls -l /삼바
drwxrws--- 3 root sambashare 4096 May 25 14:48 share
내 사용자 alex가 존재하며 "sambashare" 그룹에 올바르게 할당되었습니다. SSH를 통해 서버에 접근할 수 있는데 문제 없습니다. smbpasswd -a alex
Assign Password를 실행 하고 smbpasswd -e alex
Samba에서 사용자를 활성화했습니다.
나는 알렉스야
uid=1000(alex) gid=1000(alex) groups=1000(alex),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),123(sambashare)
그러나 다른 장치에서 공유에 액세스할 때 디렉터리에 액세스할 수 있는 권한이 없다는 오류 메시지가 나타납니다. 이는 내 사용자 이름이나 비밀번호가 틀렸다는 의미가 아니라 인증 후 권한이 부족하다는 의미입니다. /var/log/samba/log.smbd에 로그인하면 식별된 사용자가 "sambashare" 그룹에 속하지 않음을 나타냅니다.
/var/log/samba/log.smbd
mobile (ipv4:192.168.64.109:56107) connect to service %h initially as user alex (uid=1000, gid=1000) (pid 282287)
[2023/05/25 15:03:24.162311, 0] ../../source3/smbd/service.c:168(chdir_current_service)
chdir_current_service: vfs_ChDir(/samba/share) failed: Permission denied. Current token: uid=1000, gid=1000, 7 groups: 1000 4 24 27 30 46 110
[2023/05/25 15:03:24.162376, 3] ../../source3/smbd/smb2_server.c:3954(smbd_smb2_request_error_ex)
smbd_smb2_request_error_ex: smbd_smb2_request_error_ex: idx[1] status[NT_STATUS_ACCESS_DENIED] || at ../../source3/smbd/smb2_server.c:3246
분명히 올바른 사용자는 uid, gid 및 기타 그룹으로 식별되었지만 로그에는 그룹 123 "sambashare" 액세스가 표시되지 않았으므로 공유 디렉터리로 변경하려는 시도가 거부되었습니다.
디렉터리 권한을 777로 변경하면 동일한 사용자가 파일/디렉터리를 찾아보고 생성할 수 있으며, 이 모든 파일/디렉터리는 "sambashare" 그룹을 올바르게 상속하고 공유에 액세스하는 다른 사용자가 볼 수 있습니다. 그러나 이 공유에 대한 게스트 액세스를 허용하고 싶지 않습니다. 이 비공개 그룹의 구성원인 사용자에게만 액세스, 읽기 또는 쓰기가 허용되어야 합니다. 또한 Unix 사용자와 Samba 사용자(smbpasswd) 이외의 다른 사용자를 사용하여 사용자를 관리하고 싶지 않습니다.
인증 중에 정확한 그룹 정보가 부족해지는 원인을 이해하도록 도와줄 수 있는 사람이 있나요? 아니면 구성에 또 다른 실수가 있었나요?
감사해요
답변1
공유에 제한을 두려면 명시적으로 설정하는 것을 선호합니다. 나는 공유에 대해 고정된 이름을 사용할 것입니다(당신이진짜서버 이름과 동적으로 일치시키는 것이 좋은 이유입니다. 또한 변형을 사용하는 대신 직접 그룹 이름을 사용하도록 강제합니다 +
.
[sharename]
path = /samba/share
valid users = @sambashare
browseable = yes
writeable = yes
public = no
force group = sambashare
create mask = 660
force create mode = 660
directory mask = 770
force directory mode = 770
/samba/share
이상적으로는 그룹 쓰기 액세스와 /samba
그룹 읽기 액세스로 설정하는 것이 좋습니다 .
chgrp root:sambashare /samba /samba/share
chmod g=rx /samba
chmod g=rwx /samba/share
소유자 /samba/share
도 그룹의 일부인 경우 sambashare
그룹 권한과 일치하도록 소유자 권한을 설정해야 합니다. (이것은 {소유자, 그룹, 기타} 권한 집합이 상호 배타적이기 때문입니다. 그룹은 소유자를 제외한 그룹 구성원에게 적용되고, 기타는 그룹 구성원 및 소유자를 제외한 모든 사람에게 적용됩니다.)
이러한 변경을 수행한 후에는 Samba 서비스를 다시 시작해야 할 수 있으며, 새 구성으로 다시 시작할 수 있도록 처리되지 않은 하위 프로세스를 모두 종료해야 합니다. [global]
이 문제를 해결하는 데 도움이 될 수 있는 레벨 옵션은 입니다 deadtime = 10
.
내 서버에는 휴지통과 Catia도 설정되어 있습니다. [global]
구성 정의 수준 에서 :
# Recycle settings, where enabled with "vfs objects = recycle"
recycle:repository = $Recycle.Bin
recycle:keeptree = yes
recycle:versions = yes
recycle:touch = yes
recycle:mtime = no
hide files = $Recycle.Bin/.recycle
# Mapping illegal characters, where enabled with "vfs objects = catia"
mangled names = no
catia:mappings = 0x22:0xa8,0x2a:0xa4,0x2f:0xf8,0x3a:0xf7,0x3c:0xab,0x3e:0xbb,0x3f:0xbf,0x5c:0xff,0x7c:0xa6
[share]
그런 다음 활성화하려는 각 장소 에 대해
vfs objects = recycle catia
답변2
동일한 문제가 발생하여 근본 원인을 찾지 못했지만 해결 방법을 찾았습니다.
기존 그룹 이름 바꾸기(모두 루트로 수행됨):
groupmod -n cursedgroup sambashare
이름은 같지만 새 그룹 ID를 사용하여 새 그룹을 만듭니다.
groupadd sambashare
이전 그룹의 구성원을 새 그룹으로 복사합니다.
for user in $(members cursedgroup); do usermod -A sambashare "$user"; done
그런 다음 Samba를 다시 시작하고 Samba 로그를 다시 확인(디버그 수준 10)하여 새 그룹이 보조 그룹으로 나타나는지 확인했습니다.
그런 다음 가지고 있는 모든 파일을 수정 cursedgroup
하고 다음과 같이 변경해야 했습니다 sambashare
.
find / -group cursedgroup -exec chgrp -h sambashare {} \;
참고 사항:
이 특정 gid가 삼바에 의해 필터링되는 이유를 알 수 없기 때문에 이는 매우 불만족스러운 솔루션입니다. 알고 보니 이름이 아니라 GID였습니다. 내 특정 시스템에서는 gid 107이지만 그것이 특별하다고 생각하지 않습니다. 내 삼바 데이터베이스에 내가 찾을 수 없는 것이 있는 것 같습니다. 귀하의 것과 달리 sambashare
내 것에는 전혀 표시되지 않습니다 smb.conf
. 또한 삼바 데이터베이스를 확인했는데 /var/lib/samba
그룹 ID에 대한 참조를 찾을 수 없었습니다.