cpmv 명령어는 SELinux 에서 동작하는 방식이 다르기 때문에 이를 모르고 사용하면 서비스가 제대로 동작하지 않을 수 있으므로 두 명령어의 차이점에 대해서 이해가 필요합니다.


mv

파일을 이동하는 mv 명령어는 원본 파일의 보안 컨텍스트를 유지하게 되며 이때문에 의도하지 않게 SELinux 에 의해 차단될 수 있습니다.

예를 들어 사용자의 웹 컨텐츠 디렉터리가 /var/www/html 일 경우를 새로운 페이지인 hello.html 을 사용자의 홈 디렉터리에서 작성한 후에 이를 mv 를 사용하여 웹 디렉터리에 이동하는 경우를 생각해 봅시다.

nginx 사용자의 경우 배포판에 따라 다르지만 nginx 공식 사이트에서 배포하는 제품의 경우 /usr/share/nginx/html/ 가 기본 웹 디렉터리입니다.



서버에 연결한 후에 사용하는 편집기로 아래 파일을 작성합니다.

작성이 끝났다면 ls 명령어로 현재 컨텐츠의 보안 컨텍스트를 확인합니다.

root 사용자의 홈 디렉터리에 작성한 컨텐츠는 admin_home_t 컨텍스트가 부여되는 것을 알수 있습니다.

이제 mv 로 이 컨텐츠를 웹 디렉터리로 이동합니다.

# mv hello.html /var/www/html
CODE

nginx 사용자는 nginx이 기본 루트(예: /usr/share/nginx/html/hello.html) 로 이동하면 됩니다.



브라우저로 이 컨텐츠를 요청하면 제대로 서비스가 되지 않고 403 Forbidden 에러가 발생하는 것을 볼 수 있습니다.


원인은 mv 로 파일을 이동할 경우 원래 파일의 보안 컨텍스트를 유지하므로 admin_home_t 가 유지되었고 이때문에 SELinux 는 요청 파일에 웹 서버의 접근을 차단해서 입니다.


cp

cp 는 mv 와는 다르게 대상 파일이 복사되는 목적지 폴더의 기본 보안 컨텍스트를 따르게 됩니다. 예로 위의 컨텐츠를 새로 생성하고 cp 로 복사해 봅시다.


복사가 끝났으면 ls 명령으로 복사된 파일의 컨텍스트를 조회합니다.


cp 로 복사한 파일은 자동으로 목적지 폴더에 할당된 httpd_sys_content_t 가 설정된 것을 확인할 수 있습니다.


이처럼  SELinux 상에서 서버가 읽거나 써야 할 파일이나 폴더를 mv 로 처리할 경우 적절한 파일 컨텍스트가 설정되었는지 여부를 주의 깊게 확인해야 합니다.