evince

evince는 리눅스에서 많이 쓰이는 PDF 뷰어이다. (위키피디아 문서) 우분투의 경우에는 기본 프로그램으로 채택되어서 우분투 데스크톱을 설치하면 자동으로 깔리나, 서버 버전의 경우에는 설치를 해주어야 한다. 물론 apt로 간단하게 설치할 수 있다.

apt install evince

evince가 실행이 안된다?

현재 환경은 Ubuntu 18.04 Server이다. PDF 파일을 열어보기 위해 서버에 evince를 설치하고 실행했더니 다음과 같은 메세지가 출력되며 실행이 되지 않았다.

$ evince
X11 connection rejected because of wrong authentication.
Unable to init server: Could not connect: Connection refused
Cannot parse arguments: Cannot open display:

한 번도 이런 적이 없었는데… X11 연결이 거절 당했다고? 분명 설치는 잘 됐고 다른 컴퓨터에서는 잘만 작동한다. 원인은?

AppArmor

위키피디아 문서의 설명에 의하면 AppArmor는 “시스템 관리자가 프로그램 프로필 별로 프로그램의 역량을 제한할 수 있게 해주는 리눅스 커널 보안 모듈”이다. 쉽게 말해 보안 프로그램인데 커널을 감시하면서 애플리케이션에 기대되는 행동 양식을 정의하고, 금지된 행위를 할 경우 개입한다. /etc/apparmor.d/ 디렉토리에 보면 온갖 AppArmor의 설정들을 볼 수 있다.

갑자기 evince가 실행이 안되는 이유를 따지다가 AppArmor를 언급하는 이유는 이 녀석이 범인이기 때문이다. /var/log/syslogevince의 실행이 거부당한 로그가 남는다. 로그를 읽어보면 다음과 같다.

MMM DD HH:MM:SS server2 kernel: [ttttttt.tttttt] audit: type=1400 audit(tttttttttt.ttt:ttt): apparmor="DENIED" operation="open" profile="/usr/bin/evince" name="/althomepath/user/.Xauthority" pid=9703 comm="evince" requested_mask="r" denied_mask="r" fsuid=MMMM ouid=NNNN

evince의 실행을 시도하(고 있는데 잘 안되고 있)는 서버를 server2라고 부르자. server2의 홈 디렉토리는 자체 로컬 디렉토리가 아니라 다른 서버인 server1의 홈을 NFS로 마운트하여 사용하고 있다. 그런데 /home이라는 경로에 직접 마운트를 하지는 않았고 다른 경로에 마운트를 한 후 그 경로를 /home으로 심볼릭 링크가 걸려 있는 상태이다.

$ ls -l /home
lrwxrwxrwx 1 root root 21 Nov 27 11:52 /home -> /althomepath

evince를 실행하면 GUI 창이 뜨게 되고, GUI를 띄우기 위해 X11 세션이 시작되고, 세션 인증을 위해서 유저의 홈에 있는 .Xauthority 파일을 읽는다. .Xauthority 파일은 각 사용자의 홈 디렉토리에 저장되며 세션 인증을 위해 xauth에서 사용되는 쿠기의 자격 증명을 저장하는 데 사용된다. (자세한 설명은 man xauth를 쳐볼것.) 그런데 .Xauthority 파일에 접근하려고 보니 /home/user/.Xauthority가 아니고 엉뚱한 경로로 가는 것을 보고 AppArmor 입장에서는 evince가 유저의 홈이 아닌 다른 경로에 접근하고 있는 것을 감지하고 이건 아니다 싶었는지 차단을 해버리는 것 같다.

AppArmor 설정 변경

그렇다면 AppArmor에게 /home 뿐만 아니라 /althomepath도 홈 디렉토리로 인정해 주십사 간청을 해야 한다. /etc/apparmor.d/tunables/home.d 경로에 가서 파일을 새로 만들어도 좋고 기존의 파일을 수정해도 좋다. 어찌됐든 아래의 한 줄을 추가해주자.

 @{HOMEDIRS}+=/althomepath/

경로를 적어 줄 때 맨 뒤에 /까지 넣는 것을 잊지 말 것. 이제 AppArmor를 다시 실행하면 evince가 문제 없이 잘 실행이 된다.

$ systemctl restart apparmor
$ evince

evince 뿐만 아니라 다른 서드 파티 애플리케이션이 유저의 홈에 접근하려 할 때 동일한 증상이 발생한다면 같은 방식으로 해결이 가능할 것이다.

아예 AppArmor를 꺼버려도 문제가 해결되려나? 보안 프로그램을 꺼버리는 것은 뭔가 적절치 않은 듯 하여 이 방법을 시도하지는 않았음.

카테고리: Linux

0개의 댓글

답글 남기기

Avatar placeholder