다른 응용 프로그램이 포트 80 및 443에 바인딩되지 않도록 방지


16

지난주에 나는 그의 웹 사이트가 해킹 당했다고 생각해서 겁에 질린 고객으로부터 전화를 받았다. 그의 웹 사이트를 검색 할 때 apache2기본 페이지를 보았습니다 . 그날 밤 내 서버 ( Ubuntu 16.04 LTS)가 업그레이드되고 재부팅되었습니다. 일반적으로 문제가 발생하면 밤 동안 경고를 받았습니다. 모니터링 시스템이 HTTP 상태 코드 200을 확인하고 apache2기본 페이지에는 상태 코드 200이 제공 되므로 이번에는 그렇지 않습니다 .

시작 중에 apache2실제 웹 서버 nginx보다 포트 80 및 443에 바인딩하는 것이 더 빠릅니다. apache2를 직접 설치하지 않았습니다. 통해 aptitude why apache2php7.0 패키지가 필요하다는 것을 알았습니다.

apache2php7.0이 필요하기 때문에 단순히 제거하는 것은 효과가 없습니다. nginx 만 포트 80 및 443에 바인딩 할 수 있도록 제한을 만들 수 있습니까?

다른 솔루션도 환영합니다.


15
따라서 명시 적으로 업데이트를 요청할 때만 라이브 서버가 업데이트되도록 구성해야하므로 개발 시스템에서 업데이트를 먼저 테스트 할 수 있습니다.
Nzall

2
테스트 시스템에서 업그레이드를 먼저 테스트하지는 않지만 업그레이드 를 수동으로 예약 하기 전에 항상 변경 로그를 확인하십시오 . 또한 이전 업그레이드 중에 apache2가 빠져 나간 것처럼 보입니다. 이번에 재부팅 한 것은 apache2가 http 및 https 포트에 처음으로 바인딩 된 것입니다.
Boyd

9
부수적으로- This time not, because the monitoring system checks for HTTP status code 200. 웹 페이지의 실제 내용 (본문 또는 헤더의 특정 문자열)을 확인하여 모니터링 시스템을 개선 할 수 있습니다. 이는보다 안정적입니다.
VL-80

2
@Boyd 테스트 시스템에서 업그레이드를 먼저 테스트하지는 않지만 항상 변경 로그를 확인 하지만 그 방법이 얼마나 신뢰할 수 없는지 방금 경험했습니다. 변경 로그를 읽으면 배포 된 시스템에 미치는 영향을 알려주거나 도입 된 버그 나 비 호환성에 대해 알 수 없습니다.
Andrew Henle

5
@Nzall은 공평하게 말해서 이런 종류의 문제는 테스트 머신에 나타나지 않았을 수도 있습니다 ... 그는 apache2 또는 nginx가 포트를 바인딩 할 것인지에 대한 경쟁 조건을 효과적으로 가지고 있으며 테스트 머신은 이론적으로 테스트 기간 동안 nginx가 우연히 승리하므로 문제가 발견되지 않습니다.
Doktor J

답변:


29

잘못된 서비스에 의해 포트가 바인딩되는 것을 막을 수 없습니다. 귀하의 경우 자동 시작에서 아파치를 제거하면 좋을 것입니다.

16.04 이상 :

sudo systemctl disable apache2

이전 우분투 버전의 경우 :

sudo update-rc.d apache2 disable

2
이 작업을 수행 하겠지만 포트 80 및 443에 바인드 된 다른 패키지가 다른 패키지의 종속성으로 시스템에 무의식적으로 설치되어있는 향후 상황으로부터 자신을 방어 할 수 있기를 바랍니다.
Boyd

1
이것은 또한 16.04이므로 :systemctl disable apache2
muru

12
@Boyd : 왜 "무의식적으로"맹목적으로 패키지를 설치하고 있습니까? 고객이 사용하는 라이브 서버에서 어떤 패키지와 종속성이 설치되어 있는지 읽고 있지 않습니까? 그리고 실행하기 전에 어떻게 미러 서버의 모든 것을 테스트하지 않습니까? 이것들은 기본 운영 원칙 이며 모든 문제를 해결할 것입니다.
Monica와의 가벼움 경주

6
@BoundaryImposition 포트에 소프트웨어 바인딩을 방어한다고해서 패키지를 맹목적으로 설치한다는 의미는 아닙니다. 그러나 우리도 사람입니다. 실수가 있습니다. 불행히도 우리는 먼저 더미 서버에서 모든 작업을 테스트 할 수는 없지만 문제가 발생하기 1 주일 전에 apache2가 설치 되었기 때문에 즉시 문제를 표시하지 않았을 것입니다 (시스템은 문제없이 재부팅되었습니다) ). 모든 업그레이드를 테스트 할 수는 없지만 매주 업그레이드합니다. 제한적인 (모니터링을 통한) 다운 타임 위험보다 최신 보안 패치를 선호합니다.
Boyd

3
@Boyd : "안타깝게도 우리는 먼저 더미 서버에서 모든 작업을 테스트 할 수 없습니다 " 왜 그렇지 않습니까? 고객은이 절차를 건너 뛰었다는 것을 알고 있습니까?
Monica와의 가벼움 경주

27

당신이 정말로 사용하지 않는 경우 apache2 그것을 요구하는 PHP 7.0이라면, 설치 한 것처럼 보입니다 libapache2-mod-php7.0. 이 패키지는 Apache 없이는 쓸모가 없습니다. 당신의 nginx를 사용하고 있기 때문에, 당신은 가능성도있다 php7.0-fpm또는 php7.0-cgi만족에 충분하다 어느 쪽이든, 설치 php7.0종속성 요구 사항의 :

$ apt-cache depends php7.0
php7.0
 |Depends: php7.0-fpm
 |Depends: libapache2-mod-php7.0
  Depends: php7.0-cgi
  Depends: php7.0-common
  Conflicts: <php5>

둘 중 하나가 php7.0-{fpm,cgi}설치되어 있으면 Apache를 제거하십시오.


6
나는 오늘 내 상황 php7.0-fpm에서 php7.0패키지가 아닌 설치하는 것이 더 낫다는 것을 오늘 배웠다 . 이것은 또한 Ondřej Surý github.com/oerdnj/deb.sury.org/wiki/…에
Boyd

5
이것은 실제 문제에 대한 진정한 해결책입니다 : Apache를 설치하지 않고 우분투에 nginx와 PHP를 설치하는 방법.
David Cullen

2

질문에 대답하기 위해 SElinux를 사용하여 포트를 특정 응용 프로그램으로 제한 할 수 있습니다. 나는 그것을 직접 사용하지 않고 그 기능에 대한 피상적 지식 만 가지고 있지만 여기이 사이트에서 찾은 포인터가 있습니다.

/server//a/257056/392230

이 답변에서 wzzrd는 특정 응용 프로그램 (foo)에게 특정 포트에 바인딩 할 권한을 부여하는 방법을 보여줍니다 (803). 응용 프로그램 (nginx)에만 지정한 포트 (80 및 443)가 허용되도록 정책을 설정해야합니다.

wzzrd의 답변을 바탕으로 정책에 추가하는 것만 큼 간단합니다.

allow nginx_t nginx_port_t:tcp_socket name_bind;

그리고 이것을 실행

semanage port -a -t nginx_port_t -p tcp 80
semanage port -a -t nginx_port_t -p tcp 443

그러나 다른 프로그램이 해당 포트에 바인딩되지 않도록 지정하는 정책에 한 줄이 필요하다고 생각합니다.

결국, 나는 적절한 구성이 무엇인지 추측하고 있습니다.

어쨌든 SElinux가 설치되고 기본적으로 활성화되어있는 Ubuntu가 있다고 생각하지 않습니다. 다양한 유틸리티와 커널 옵션에 특정 패치를 적용해야한다고 생각하기 때문에 SElinux를 설치하고 사용할 수있는 Centos를 사용하는 것이 더 쉬울 수 있습니다.

더 이상 도움이되지 않습니다. 다른 시간에 Centos의 이미지를 다운로드하여 시도해보십시오. 좋은 학습 단계가 될 것입니다. 이 답변을 업데이트하면 업데이트하겠습니다.


2
lol @ "Centos를 사용하는 것이 더 쉬울 것입니다"
David Cullen

2

아직 답변에서 보지 못했지만 여전히 가능성이있는 것 :

만일을 대비하여 다른 포트를 수신하도록 Apache 구성을 변경하십시오. Apache config 파일을 열고 Listen 80다른 포트에 있는 행을 변경하여이를 수행 할 수 있습니다 .


이는 승인 된 답변과 동일하게 문제를 "해결"하지만 변경 사항을 설명 / 문서화해야하는 추가 문제가 있습니다. 또한 문제를 해결하지만 전체 문제를 해결하지는 않습니다. 아파치가 비활성화되었지만 다음에 다시 부팅 할 때 응용 프로그램 X가 포트 80에 바인딩되면 동일한 오류가 다시 발생합니다.
Darren H

0

정확한 질문에 대한 답변이 없지만 배포판을 봐야 할 수도 있습니다. 설치시 서비스 (apache2)가 안전하지 않은 배포판을 고려할 것입니다. 그렇게하지 않는 배포판을 살펴보십시오. Archlinux에서 그 동작을 본 적이 없다고 말할 수는 없습니다. 다른 사람들도 있다고 확신합니다.


1
그렇다면 서버를 포맷하고 다른 배포판을 설치하려면 무엇을 권장합니까? 왜 다른 답변에서 알 수 있듯이 우분투가 특정 서비스를 처리 할 수 ​​없다고 생각하십니까? 이 답변은 종교적인 의견이며 도움이되지 않습니다.
Wtower

지금은 서버를 포맷하지 않고 새 배포판을 설치하지만 다음에 서버를 업그레이드해야 할 때 확실히 변경됩니다. Ubuntu는 구성되지 않은 서비스를 활성화했기 때문에이 게시물에서 부적합한 것으로 나타났습니다 (이에 대한 예외는 그래픽 로그인 또는 사운드 서비스, 일반적으로 작동하고 공개 인터넷에 노출되지 않는 것들과 같은 것임) ). 나는 대답이 조금 종교적으로 나올 까봐 두려웠다. 그러나 그것은 의도가 아니었다. 그것은 더 큰 문제로 본 것에 대한 해결책을 지적하려고했다.
phelbore

1
나는 그렇게하는 것이 배포판이 부적절하다는 것에 동의하지만, 실제로 질문에 대답하지 않기 때문에 이것이 의견으로 더 적절했을 것이라고 생각합니다.
JoL

그것은 좋은 지적입니다.
Monica와의 가벼움 경주
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.