메뉴 닫기

Ubuntu 26.04 + Apache 2.4.66 환경에서 쓰기가 안될때

 

Apache ProtectHome 읽기 전용 문제를 해결하는 방법을 알려드립니다.
서버에 Ubuntu 신버전 26.04 를 설치하거나,  기존 Ubuntu를 26.04로 업그레이드하신 분들 중에, 웹 사이트에서 잘 되던 업로드 기능이 갑자기 먹통이 되는 경우가 있습니다.
오늘은 그 원인과 해결 방법을 정리해봤습니다.

 

1. 증상

uploads 폴더 권한을 707이나 777로 바꿔봐도 여전히 업로드가 실패 됩니다.
PHP의 is_writable()은 true를 반환하는데, 정작 fopen()이나 move_uploaded_file()을 실행하면 Failed to open stream: Read-only file system 에러가 발생합니다.
하지만, 신기하게도 sudo -u www-data로 쉘에서 직접 쓰기 테스트하면 성공하는데, PHP(Apache)를 거치면 항상 실패가 되고,
이는 권한 문제가 아닌 게 분명한데도 계속 막히니 답답하실 텐데요, 원인은 따로 있었습니다.

 

2. 원인

Apache 2.4.66부터 적용된 systemd 하드닝(시스템이나 서비스의 보안을 강화해서 공격 표면을 줄이는 작업)이 원인이였습니다.
Ubuntu 26.04의 Apache2 패키지가 2.4.66-1 버전으로 올라오면서, 패키지 관리자가 systemd 서비스 유닛에 보안 강화 옵션을 기본으로 넣었습니다.
바로 ProtectSystem=full, ProtectHome=read-only, RestrictSUIDSGID=yes 입니다.

이 변경 사항은 Debian apache2 패키지의 공식 체인지로그에 남아 있습니다.

[출처] Launchpad – apache2 package changelog
[위치] apache2 (2.4.66-1) unstable 항목, [ Bastien Roucariès ] 서명 아래 “Harden systemd services” 문구

패키지 관리자 본인도 이 변경이 “/home 경로에 쓰는 CGI 스크립트나 WebDAV, CGI/PHP/Lua 사용을 깨뜨릴 수 있다”고 체인지로그에 직접 적어뒀을 정도로, 영향 범위를 명확히 알고 있었던 변경입니다.
참고로 Ubuntu 24.04 LTS에서는 이 옵션이 없었고, Apache 2.4.66을 탑재한 Ubuntu 26.04부터 기본 활성화됩니다.
그래서 “예전 서버에선 잘 됐는데 새 서버에서만 안 된다”는 분들이 계신 거죠.

 

3. 확인하는 방법

아래 명령으로 현재 서버의 설정 값을 바로 확인할 수 있습니다.

# systemctl show apache2.service | grep ProtectHome
ProtectHome=read-only

결과가 이와같이 ProtectHome=read-only로 나온다면, 바로 이 문제입니다.

 

4. 해결 방법

uploads 경로만 예외로 열어주면 됩니다.
/home 전체를 쓰기 가능하게 풀어버리면 이 하드닝을 적용한 의미가 없어지므로, 실제로 업로드가 필요한 디렉토리만 콕 집어서 예외 처리하는 게 좋습니다.

# mkdir -p /etc/systemd/system/apache2.service.d
# cat > /etc/systemd/system/apache2.service.d/override.conf << ‘EOF’
[Service]
ReadWritePaths=/home/smileserv/public_html/file/uploads
EOF

만약 서버에서 운영 중인 다른 웹 사이트에서도 업로드나 쓰기 디렉토리를 갖고 있다면, 한 번에 같이 추가해두는 걸 추천합니다.

# cat > /etc/systemd/system/apache2.service.d/override.conf << ‘EOF’
[Service]
ReadWritePaths=/home/smileserv/public_html/file/uploads
ReadWritePaths=/home/smileserv/public_html/share/uploads
EOF

설정 파일을 저장했다면 아래 명령으로 반영합니다.

# systemctl daemon-reload
# systemctl restart apache2

마지막으로 적용된 설정을 다시 확인해봅니다.

# systemctl show apache2.service -p ReadWritePaths
ReadWritePaths=/var/log/apache2 /var/cache/apache2/mod_cache_disk /home/smileserv/public_html/file/uploads /home/smileserv/public_html/share/uploads

목록에 uploads 경로가 제대로 나온다면, 이제 웹에서도 파일 업로드가 정상적으로 동작할 겁니다.

 

5. 마무리

권한을 아무리 만져도 안 되던 문제라 삽질을 좀 하실 수 있는데, Apache 패키지 자체의 systemd 하드닝 변경이 원인이라는 걸 알면 해결은 금방입니다.
Ubuntu 26.04로 넘어가신 분들은 한 번쯤 겪게 될 이슈이니 미리 체크해두시는 것도 좋겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다