1. 문제점
최근 스프링부트로 작업하는 프로젝트에 Logstash로 로그를 관리하기로 했습니다. 기존 프로젝트에 logback-spring.xml를 설정해주고 배포를 하니 503에러를 발생하고 있었습니다. 로컬에서는 별 문제 없었기에 배포 이후에도 문제될 것이 없다고 생각하였습니다. 젠킨스로 배포 시에도 에러 메세지 없이 잘 실행되었습니다.
2. 과정
2-1. 폴더 생성권한
처음드는 생각은 폴더의 권한 문제였습니다.
설정을 살펴보면, 로그는 var/log/admin
폴더 아래에 파일을 생성하도록 설정하였습니다. 로컬에서는 logbck
설정을 하면 자동적으로 폴더가 생성되었기에 그대로 배포를 하였습니다. 하지만 서버에서는 배포가 실패하면서 No such file or directory
에러를 발생시키고 있었습니다. 생각컨데 배포하는 권한은 deploy
라는 유저로 배포를 하지만 폴더를 생성하는 권한은 root
권한으로 지정되어 있어 폴더 자체를 생성시키지 못한 것 같았습니다.
2-2. 폴더 생성
폴더를 자동적으로 생성할 수 없으니 폴더를 생성하여 다시 실행해보았습니다. 초기 폴더의 권한은 다음과 같았습니다.
drwxr-xr-x. 2 root root admin
폴더는 root 권한을 가지므로 빌드는 실패하게 될 것입니다. 어떤 에러를 발생하는지 살펴보기 위함입니다. 다시 빌드 해보았습니다.
java -jar 프로젝트.jar
예상대로 빌드에 실패하였고 아까와 다르게 Permission denied
에러를 발생시켰습니다. 즉, 명령어를 실행한 user
권한은 root
권한을 가진 폴더에 접근할 수 없기 때문에 Permission denied
에러를 발생시킨 것입니다.
2-3. 폴더 그룹 지정
그러면 이제 폴더의 권한을 user
로 바꾸어 보겠습니다.
sudo chown user:user admin
실제 서버를 배포하는 권한을 가진 user
를 임시로 폴더 권한을 주고, 다시 한번 실행해 보았습니다. 예상이 맞다면 배포 실행권한을 가진 유저가 배포를 하고 동시에 admin 폴더에 로그를 남기게 될 테니 성공해야 할 것입니다.
빌드가 성공적으로 진행되면서 admin
폴더에 다음과 같이 log들이 생성되게 됩니다.
2-4. Jenkins 빌드/배포
Jenkins에서 배포를 실행하는 권한은 deploy
사용자가 가지고 있습니다. 즉, 배포를 실행하면 deploy
라는 사용자가 로그가 있는 admin 폴더에 접근하게 됩니다. 그렇다면 admin 폴더의 권한을 deploy
에게 주어야 하는데, deploy
라는 사용자는 다른 사람의 사용자이므로 폴더권한을 내가 아닌 다른 사람이 가지고 있는 것은 보안상 좋지 못합니다. 그래서 deployGroup
이라는 그룹을 만들어서 deploy
와 user
를 그룹안에 넣어줍니다.
그렇게 되면 폴더의 소유 그룹을 deployGroup
로 지정해주게 된다면 deploy
사용자가 배포를 실행하면서 admin 폴더에도 접근하게 됩니다. 폴더의 그룹권한을 바꿔보겠습니다.
sudo chown user:deployGroup admin
그리고 Jenkins로 배포를 실행해보았습니다.
위와 같이 잘 실행 되었고 로그도 확인할 수 있었습니다.
tail -f debug.log
3. 결론
결론부터 말하자면, 서버내 폴더의 권한 문제였습니다.
서버를 실행하는 사용자가 누구였는지 궁금하였는데 Jenkins에 정해진 배포 사용자가 따로 있게 되었다는 것을 알았습니다. 이 사용자가 폴더의 소유권한이나 그룹에 없다면 빌드에 실패하는 것을 보았습니다.
마지막으로 사용자와 그룹에 관련된 커맨드를 정리하면서 마칠까 합니다.
- 그룹 확인
groups
- 사용자가 어디 그룹에 속해있는지 확인
id 사용자
- 사용자-그룹 관계 확인
cat /etc/group
- 그룹 추가
groupadd 그룹이름
- 사용자를 그룹에 추가
usermod -G 그룹 사용자