포럼
소켓을 이용한 리눅스 제어
2014.12.10 23:11
얼마전부터 고민하던 내용인데..
사이트 회원 분들에게 간단한 웹공간을 만들 수 있도록 계정발급을 자동화 할 수 있는 방법을 고민중입니다.
물론 간단하게 한다면야.. php의 system 이나 exec에서 아파치유저의 패스워드를 이용하여 sudo로 관련 명령어나 쉘스크립트를 실행해주면 끝나긴 하겠지만.. 왠지모르게 꺼림직한게 사실입니다.
그래서 국내 리눅스 관련 포럼이나 해외 포럼등을 찾아보던 중에 소켓을 이용하여 리눅스제어하는 방법이 있다는 이야기를 들었는데 자세한 내용은 없고 그냥 그런 방법이 있다 라는 이야기만 있네요.;;;
요즘 XE사이트에 보안쪽이나 서버쪽으로 지식이 깊으신 분들이 계시는 것 같아서 여쭈어봅니다만.. 다들 어떻게 생각하시는 지요?
일단 첫번째로 어떤방식으로 구현이 되는 것인가? 에 대한 정보를 가지고 계신분이 계시면 힌트나 정보를 얻을 수 있을까요?
그리고 두번째 PHP방식과 비교해서 서버보안 측면에서의 주의할점..
( 소켓쪽은 C에서 간단한 TCP통신 하는 정도의 지식밖에 없어서 소켓서버의 보안 관련 내용이 전무합니다. 아는 내용은 뭐 헤더의 origin 체크하는 방법 정도인데 이건 변조할 수 있어서 너무 믿지는 말라라고 하더라구요 ^^;;)
딱히 방법이 없으면.. 계정 정보를 입력받아 유효성 체크 후 저장 한 뒤 일정 시간마다 cron 돌려서 하는 방법이 그나마 안전 할듯 한데..
이러면 발급까지의 시간이 걸리니... ^^;
한번 좋은 아이디어가 없을까 이야기를 나눠볼까 합니다.
소켓이 아니더라도 기존의 PHP를 이용하는 방법 중에서 보안성이 강화된 방법이 있으면 그쪽 관련 되어서도 이야기를 나누고 싶습니다.
( 질답으로 가야될 지 포럼이 맞는 건지 고민을 하다가.. 서로 의견을 나누는 쪽으로 갈 것 같아서 포럼에 올렸습니다만 맞지 않는 내용이면 질답으로 옴겨주셔도 됩니다.)
댓글 10
-
GG
2014.12.11 03:13
-
Canto
2014.12.11 23:58
음.. 역시 그런식으로 가는 수밖에 없을까요?
cron으로 쉘스크립을 1초마다 실행 하는 방법은 생각해보긴 했는데..
-
기진곰
2014.12.12 09:05
cron은 1분이 최소 단위입니다. 1초 단위로 하려면 직접 구현해야 해요.
-
Canto
2014.12.12 15:02
네 그건 알고 있습니다.
* * * * * for i in `seq 1 59`;do (sleep ${i} ; /script/script.sh) & done;
이런식으로 seq 커맨드로 대기를 줘서 초단위로도 사용할까 했었습니다.
-
기진곰
2014.12.12 16:50
1초마다 새로운 쉘을 생성하려면 시스템 자원이 많이 소모됩니다.
1분마다 실행한 후, 스크립트 내에서 루프를 돌려 sleep 1 해주세요.
-
AJKJ
2014.12.12 01:53
ZPanel이나 arjenti, cPanel(유료) 같은것으로도 가능하지 않을까요? 해외 웹호스팅 업체들이 이런것을 이용하여 많이 웹호스팅 운영하는것으로 알고 있어서요.
-
Canto
2014.12.12 15:10
그런 종류의 솔루션으로도 가능한가요?
그냥 일반 관리만 가능 한 줄 알아서 생각도 안해봤었는데..
-
AJKJ
2014.12.13 04:15
찾아보니 그 자체만으로는 안되고 그런것과 연동되는 솔루션을 이용하면 되는듯 합니다.
구글에서 webhosting billing 또는 automation으로 검색하면 많이 나오는것 같습니다.
찾아본것들은 CPanel + WHM 기반이라서 비용이 꽤 들것 같습니다. zpanel(xmws)의 경우는 무료로도 가능해 보이네요
http://www.whmcs.com/features + cpanel + cpanel whm
http://www.boxbilling.com/features
http://www.webhostingtalk.com/wiki/Billing_and_automation_software#Leased_license
https://github.com/bobsta63/xmws-php-client
-
기진곰
2014.12.12 09:17
어떤 방식을 쓰든 root 권한으로 실행되는 프로그램이 하나는 있어야 합니다.
그러나 웹서버 계정이 직접 sudo를 쓸 수 있도록 하는 것은 위험하니
처리해야 할 데이터를 웹서버 계정에서 DB에 입력해 두면
root 권한으로 실행되는 프로그램이 그 DB에서 데이터를 읽어 실행하는 방식을 쓰죠.
cron을 사용해서 일정 시간 간격으로 처리해도 되고,
아예 데몬으로 만들어서 계속 실행하면서 1초마다 체크해도 됩니다.
message queue, publish/subscribe 등으로 검색해 보시면 관련 정보가 꽤 있습니다.
소켓을 사용한다는 것은 cron이나 별도의 DB를 거치지 않고
root 권한으로 실행되는 데몬이 특정 포트에서 연결을 기다리고 있으면
여기에 직접 연결하여 명령을 전달한다는 뜻인 것 같은데,
이것도 보안상 그다지 좋은 방법은 아닌 것 같습니다.
localhost에서 실행되는 모든 프로그램이 소켓에 마음대로 접속할 수 있을 테니 말이죠.
비번을 먼저 전송하지 않으면 연결을 끊어 버린다거나... 해도 되지만
괜히 복잡해지는 것 같아요. 하나라도 잘못하면 서버 작살나는 수가 있습니다.
어떤 방식을 쓰든, shell command injection 공격을 막는 것이 가장 중요할 것 같습니다.
"useradd xxx"처럼 명령 전체를 DB에 입력했다가 그대로 읽어서 실행하는 방식이면 곤란해요.
계정 이름, 비번 등 최소한의 정보만 DB에 입력하도록 하고,
그걸 읽어들이는 프로그램은 정규식이나 ctype_* 함수를 사용해서
정해진 규칙에 맞는지 철저하게 확인한 후, 명령을 작성해서 실행해야겠죠.
만약 이쪽을 PHP로 구현한다면 escapeshellarg 함수 사용도 필수!
-
Canto
2014.12.12 15:05
감사합니다. 입력값을 어떻게 검증하는가가 가장 중요하겠네요..
주신 정보로 한번 찾아보겠습니다. ^^
웹 DB를 1초마다 체크해서 계정을 발급하는 C 프로그램을 만들어 보시면 될 것 같아요.
그래야 웹서버가 부담이 없을 것 같습니다.