nextcloud 쓰기 권한.

TLDR;

다음 두가지를 고려한다. 단, setgid 가 설정돼 있다는 가정이 선행된다.

  • 쓰기권한이 필요한 디렉토리의 Group 에, www-data(또는 apache 를 수행하는 사용자) 를 추가한다.
  • /etc/apache2/envvarsumask 002 를 추가한다.

이러면 nextcloud 에서 생성한 파일을 서버의 사용자가 직접 수정할 수도 있고, 서버 사용자가 만든 파일을 nextcloud(다시 말해 www-data)가 쓸 수도 있다.


nextcloud 자체에 쓰기 권한 기능이 있나? 대충 둘러봤지만 찾을 수가 없었다. 아마도 없다고 생각된다.
nextcloud 는 사실 Apache 등 웹서버에 의해 작동되고, Apache 는 시스템에 할당된 특정 사용자(www-data 등)의 권한으로 실행되므로, 모든 읽기/쓰기 작업은 당연히 그 사용자(www-data 라고 가정)의 능력(?)에 달려있다.

내가 nextcloud 에서 외부 저장소로 설정한 한 디렉토리의 상황을 보자면 이렇다.

drwxrwsr-x 1 userabc networkgrp  470 2016-01-05 22:03  그림

이 디렉토리는 userabc 소유이고, 그룹은 networkgrp 이며, 그룹에는 setgid 가 적용돼 있다.
이 상태 그대로라면, 이 디렉토리를 nextcloud 에선 읽을 수만 있고 쓸 수는 없다. www-data 는 userabc 가 당연히 아니며, networkgrp 도 아니기 때문이다.

쓰기가 가능해지려면 몇가지 방법이 있을텐데.. 내 지식 선에서 언뜻 생각나는 건 대충 이 정도.

  • 이 디렉토리 소유권을 www-data:www-data 로 바꾼다.
  • 디렉토리 소유권을 userabc:www-data 로 바꾼다.
  • www-data 를 networkgrp 그룹에 가입시킨다.
  • 그냥 다 열어버린다. (chmod 777)

첫번째 방법엔 무리가 따른다. 이 디렉토리는 nfs 로도 공유가 되고 있는데, 소유권이 이렇게 바뀌면 다른 사용자(즉, 우분투 기준 uid 1000 등등)들은 이 디렉토리 및 하부 파일들을 수정할 수 없게 된다.

두번째 방법은, 언뜻 보면 괜찮은 방식 같지만, 절대로 쓰면 안되는 방식이다. 왜냐? 이 상태에서 nextcloud 로 파일을 생성하면, 소유권이 www-data:www-data 가 돼 버린다. 따라서 첫번째 방법과 동일한 상태가 돼 버린다.

네번째는? 이렇게 할 거면 굳이 이런 글을 쓰고 있을 이유가 없다.

결국, 세번째 방법이 내가 아는 선에서 가장 최선이라고 할 수 있겠다.

sudo usermod -a -G networkgrp www-data

이걸로 끝?
이라면 좋겠지만..

여기서 또 한가지 문제가 생긴다.
nextcloud 에서 각각 폴더/파일을 만들어보았다.

-rw-r--r-- 1 www-data networkgrp   48 2021-03-22 21:30  new-by-nextcloud2.txt
drwxr-sr-x 1 www-data networkgrp    0 2021-03-22 21:32  폴더새거

큰 문제가 생겼다.
파일 생성엔 문제가 없었지만, 권한이 잘못 주어졌다. 그룹에 쓰기 권한이 있어야 하는데, 사용자에게만 ‘w’ 가 주어졌다.
이러면 힘들여 www-data 를 그룹에 참여시킨 이유가 없다. 이 설정대로라면, www-data 만이 이 파일을 수정할 수 있게 된다.

왜 이런 어처구니없는 상황이?
답은, 아주 우연하게 찾게 되었는데.. 만약 답을 못찾았으면 끝없는 삽질을 또 다시 할 뻔 했다.
게다가 웃긴 건, 이미 내가 써놓은 글에 답이 있었다는 건데.. 2019년 9월에 작성했다고 나와있지만, 정말 털끝만큼도 기억이 나질 않는다. 기억이 나지 않는 이유는, 써놓기만 하고 정작 적용을 하진 않았기 때문이리라.

이 글을 쓰는 도중, setgid 에 대한 내용이 있는 글을 찾고자, 구글에서 그룹 권한 site:nemonein.xyz 라고 검색을 했다. 그 결과 제일 처음에 나온 글이 “꽃삽질 : nologin 사용자의 umask 는..?? 특히 www-data 는 어떻게?” 였고, 무슨 내용인지 살펴봤는데..
바로 윗 부분에 대한 답이 쓰여져 있었다.
이런???

자세한 내용은 저 글을 참고하고, 답은 이렇다.

/etc/apache2/envvarsumask 002 를 추가한다.

apache 를 재시동하면, 드디어 원하는 결과를 얻을 수 있다!

아무도안아무도안
Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.