chroot를 버려야 할까, 아니면 iproute2를 감옥에 복사해야 할까?
불완전한 감옥은 부팅 때가 아니라 시작된 뒤에 실패합니다. 강화를 완화하는 것과 바이너리와 라이브러리를 새 루트로 복사하는 것 중에서 고르세요.
서비스가 시작되고 클라이언트가 연결되지만, 서버 쪽에는 경로가 끝내 나타나지 않습니다. 아니면 데몬이 시작을 거부하고 실행하지 못한 명령을 지목합니다. 두 결과 모두 보통 강화 가이드에서 한꺼번에 복사하는 같은 세 줄을 따릅니다. 비특권 계정으로 전환하고, 그룹을 버리고, 파일 시스템 루트를 바꾸는 것입니다. 셋 중 파일을 숨기는 것은 하나뿐이고, 그중 하나만 라우팅 테이블을 바꿀 권한을 빼앗습니다. 그것을 나눠 보는 것이야말로 정말 필요한 줄이 어느 것인지 아는 방법입니다.
감옥이 빼앗는 것, 그래도 데몬이 필요로 하는 것
루트 변경은 시작 뒤에 일어나므로, 데몬은 이미 연 것은 그대로 유지하고 나중에 열었을 것은 모두 잃습니다. 연결이 그 시점 이후에 실행하는 도우미는 로드하는 공유 라이브러리와 함께 새 루트 안에 있어야 합니다. 설정 파일과 인증서만으로 만든 감옥에는 둘 다 없습니다.
비특권 계정으로 전환하는 것은 별개의 제약입니다. root를 포기한 프로세스는 바이너리가 바로 거기 있어도 경로를 바꾸지 못하거나 인터페이스를 올리지 못할 수 있으므로, 두 고장은 따로 진단해야 합니다.
세 가지 조건이 어떤 수정이 필요한지 정합니다
첫 번째 조건은 빌드가 경로를 어떻게 설치하는가입니다. 최신 OpenVPN 릴리스는 인터페이스와 라우팅 테이블을 프로세스 안에서 설정하지만, 오래된 패키지와 직접 만든 구성은 외부 도구나 up, down 스크립트에 의존합니다. 로그가 명령을 지목하면 외부 도구가 개입한 것이고 감옥이 그것을 숨기고 있습니다. 대신 권한 오류가 보이면 문제는 계정입니다.
두 번째는 유지 관리입니다. 바이너리를 복사한 감옥은 그 바이너리를 제공하는 패키지가 업그레이드될 때마다 새로 고쳐야 하며, 그러지 않으면 첫 업그레이드가 끊어진 터널을 남깁니다. 세 번째는 특정 통제가 정말 chroot를 요구하는가입니다. 요구가 사실은 권한 분리에 관한 것이라면 계정 전환만으로 충분할 수 있습니다.
| Signal in the log | Other side of the boundary | Repair direction |
|---|---|---|
| Command not found after startup | Binary and its libraries absent inside the new root | Populate the jail, or drop the chroot line |
| Operation not permitted | Account lost the privilege to edit routes | Keep the account privileged, or pre-create routes elsewhere |
| No such device | Jail lacks the tun device node | Create the node inside, or open it before the root change |
작동하는 감옥에 반드시 있어야 하는 것
명령을 실행하는 감옥에는 바이너리, 그것이 링크하는 모든 라이브러리, 데몬이 늦게 여는 모든 장치 노드가 필요합니다. 부품을 복사하고 VPN 없이 시험해 보세요:
ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up
첫 명령은 의존성을 나열하며, 사람들이 가장 자주 건너뛰는 것이 바로 이것입니다. 복사한 바이너리가 라이브러리를 찾지 못할 때의 메시지는 바이너리가 없을 때와 다르고, 둘 다 클라이언트 쪽에서 보면 OpenVPN 고장처럼 보입니다. 감옥 안에서 명령을 손으로 실행하면 서비스를 다시 시작하지 않고도 고장을 재현할 수 있습니다.
설정, 인증서, CRL이 있으면 그것도 감옥에 복사하세요. 시작 뒤에 다시 읽으려는 파일은 루트가 바뀐 뒤에는 찾을 수 없기 때문이며, 무엇을 복사했는지 적어 두지 않으면 네트워크 패키지의 다음 업그레이드가 원본을 바꾸고 감옥은 옛 복사본에 남습니다.
대신 강화를 줄이기
감옥이 어떤 가이드가 그렇게 말해서 존재할 뿐이라면, 그 한 줄을 지우고 계정 제약을 남기는 것은 방어 가능한 결과입니다. 데몬은 파일 시스템에 대한 시야를 유지하고 문제는 사라지며, 권한 하락은 오래 사는 프로세스에서 root를 여전히 빼앗습니다.
무엇이 남았는지, 왜 그렇게 했는지 적으세요. 통제를 조용히 하나 잃고 메모가 없는 구성은 강화가 어긋나는 방식이며, 다음 감사는 그 줄이 왜 사라졌는지 묻습니다.
고르기 전에 세 줄을 나눠 보기
설정을 복사하고 세 지시를 모두 끈 뒤, 클라이언트가 연결되고 예상한 경로가 나타나는지 확인하세요. 그다음 계정 관련 줄만 되살리고, 마지막으로 chroot만 되살립니다. 터널이 끊기는 단계가 경계를 알려 줍니다. 그러면 애초에 원인이 아니었던 감옥을 다시 만들지 않아도 됩니다.
경로가 돌아오면 자세한 로그 수준으로 클라이언트 세션을 한 번 실행하고, 명령이나 권한 실패를 지목한 줄을 읽으세요. 그 줄은 클라이언트가 마침내 보고하는 타임아웃보다 값어치가 있습니다.