날짜-사용자에게 허용되지 않음 www-data


0

Debian GNU / Linux 7.5 (wheezy)에서 lighttpd 서버를 실행하고 있으며 PHP 웹 페이지를 사용하여 시스템 시간을 변경하려고합니다 (페이지 시간 만 변경할 수는 있지만이 프로젝트에는 필요하지 않습니다). 지금은 exec()명령을 사용하여 명령을 직접 실행하고 쉘 스크립트를 실행하고 있습니다. 그래서 :

exec('date --set [HH:MM:SS]')

또는

exec("sh /full/file/path/updateTime.sh") //contains command 'date --set [HH:MM:SS]'

명령 줄의 사용자를 www-data로 전환하고 날짜 명령을 실행하려고하면 "날짜 : 날짜를 설정할 수 없습니다 : 작업이 허용되지 않습니다."라는 응답을 얻습니다.

루트로 실행하면 쉘 스크립트가 성공적으로 실행됩니다.

exec()응답을 유지 하기 위해 두 번째 인수를 제공하면 설정하려는 날짜 / 시간 정보가 포함됩니다.

또한 sudoers를 편집하여 추가하려고했습니다.

www-data        ALL=(ALL:ALL) ALL

아래 user privilege specificationincludedir /etc/sudoers.d변화없이. 또한 Cmnd 별칭 사양을 /bin/date만들고 변경없이 www-data 사용자에게 추가하려고했습니다.

나는 관련된 모든 것에 대해 경험이 부족하므로 도움을 주시면 감사하겠습니다.

이 사이트는 작동하지 않지만 사용자의 쉘 ​​명령 수락과 관련된 위험을 알고 있습니다. 나는 확인했습니다 php.ini있는지 확인하기 위해 파일을 exec()명령이 비활성화되지 않습니다. 쉘 스크립트의 소유권을 /var/www/변경하지 않고 www-data 에 제공하려고했습니다 . 현재 권한은 777로 설정되어 있습니다.

답변:


2

www-data가 sudoers 파일에있는 경우 www-data는 sudo암호를 입력 할 수 없으므로 명령에 암호가 필요하지 않다고 설명합니다.

sudoers 항목은 www-data ALL=(ALL:ALL) NOPASSWD: ALL

그런 다음 sudo date --set [HH:MM:SS]그냥 대신 실행해야합니다 date --set [HH:MM:SS].

www-data는 sudo테스트 서버에서 자신의 개인 개발 용도로만 사용하지 않는 한 절대 권한을 가져서는 안됩니다 . 이것은 큰 보안 허점입니다.

편집 : PHP exec ()에서 유사한 sudo 인 이 질문을 살펴보십시오.


www-data가 date --set루트로 할 수있는 것을 제한하는 것이 더 안전합니다 ( "실제"사용에는 여전히 위험하지만) . 나는이의 sudoers 구문 권리를 이해 모르겠지만, 나는 생각 이있을 것 "www가 데이터 ALL = (루트) NOPASSWD / 빈 / 날짜 --set"(다음 사용 exec('/usr/bin/suro /bin/date --set [HH:MM:SS]')하여 경로가 약간 다를 수 있습니다 있지만, ).
Gordon Davisson

@ GordonDavisson, 왜 명령 /usr/bin/sudo의 인수에 추가 된 부분이 필요 exec()합니까? 그것이 sudo 명령의 위치이기 때문입니까 (다시 말하지만, 멍청한 질문처럼 들리면 미안하게 배우고 있습니다)?
Nick

또한 sudoers에 "--set"을 추가하면 www-data가 어떤 것도 sudo하지 못했지만 "/ bin / date"에서 끝나는 것이 효과가있었습니다. 감사!
Nick

@ Nick : 실제로 전체 경로를 포함시킬 필요는 없다고 생각합니다. sudo또는 date스크립트가 PATH관련 디렉토리를 포함하지 않는 이상한 것으로 실행될 경우에 포함시키는 것을 선호합니다 . "--set"옵션은 문제를 일으킨다 : "/ bin / date --set *"와 같이 다른 인수가 허용되도록 지정해야 할 수도 있지만, 그대로두면 작동하지 않는다고 생각한다 그게 덜 안전합니다.
Gordon Davisson 2012 년

@ GordonDavisson, 내 오류가 sudoers에서 "/ bin / date --set *"주위에 따옴표를 넣는 것으로 나타났습니다. 나는 그들이 왜 그곳에 있어야한다고 생각했는지 잘 모르겠습니다.
Nick

0

다른 접근 방식이 있습니다.

  • 합리적으로 안전한 장소에 FIFO (명명 된 파이프)를 만드십시오. 세계에서 쓸 수없는 곳은 괜찮습니다. 
  • www-data모드 600을 소유 하십시오. 또는 200이 작동해야합니다.
  • PHP 응용 프로그램이 시스템 시간을 변경하려고 할 때마다 새로운 시간을 FIFO에 쓰십시오.
  • 루트로 실행되는 데몬 프로세스가 FIFO에서 읽도록하십시오. 올바르게 포맷 된 시간을 읽으면 시스템 시계를 설정하십시오.

엉망 일 필요가 없습니다 sudo. 누군가가 시스템에 침입 www-data 하면 FIFO에 시간 변경 사항을 기록하고 데몬이 시간을 변경하게 할 수 있다는 최악의 상황이 발생할 수 있습니다. root 데몬에 취약점을 만들지 않는 한 공격자가 자신의 권한을 상승시킬 수있는 것은 거의 불가능한 것 같습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.