10P by xguru 3달전 | favorite | 댓글과 토론
  • 서버에 UDP 패킷을 보내서 명령을 실행하는 도구
  • 명령은 서버 측에서 구성되므로 클라이언트는 실행할 명령을 정의하지 않고 기존 명령 중에서 선택만 함
  • 3개의 바이너리로 구성
    • client: 컴퓨터에서 실행되어 UDP 패킷을 전송
    • server: UDP 패킷을 수신하고 유효한지 확인
    • commander: UDP 패킷의 데이터로 인코딩된 명령이 유효한 경우 실행
  • 보안
    • UDP로 보내지기 때문에 서버는 전혀 응답하지 않음 : 포트 스캐닝 불가
    • 클라이언트에서 서버로 전송되는 데이터는 RSA를 사용하여 암호화
    • 클라이언트는 실행할 명령만 정의하고 명령은 서버에 저장 -> 클라이언트는 명령을 선택할 수는 있지만 정의할 수는 없음
    • 가능한 한 적은 운영 체제 권한을 사용하도록 서버 소프트웨어를 실행
    • 서버가 수신한 모든 패킷을 차단 목록에 추가하여 replay에서 보호
    • (WIP) DoS 보호

사용 예 : single packet authorization (SPA)

서버의 보안을 위해서 SSH를 완전히 차단하는 대신, SSH포트를 짧게 열었다 다시 닫는 방식을 도입 가능

address = "0.0.0.0:8080"  # Ruroco 서버가 수신 대기하는 주소 (systemd/ruroco.socket 사용하지 않는 경우)  
config_dir = "/etc/ruroco/"  # 설정 파일이 저장되는 경로  
  
[commands]  
# SSH 열기 (요청이 온 IP 주소에 대해서만)  
open_ssh = "ufw allow from $RUROCO_IP proto tcp to any port 22"   
# SSH 닫기 (요청이 온 IP 주소에 대해서만)  
close_ssh = "ufw delete allow from $RUROCO_IP proto tcp to any port 22"  
  • 서버에서 이렇게 Ruroco를 구성하고 클라이언트 측에서 다음 명령을 실행
    ruroco-client send --address host.domain:8080 --private-pem-path /path/to/ruroco_private.pem --command open_ssh --deadline 5
  • 서버는 RSA를 사용하여 클라이언트가 해당 명령을 실행할 수 있는 권한이 있는지 확인하고 "open_ssh" 아래에 정의된 명령을 실행
  • --deadline 인수는 명령 실행 후 5초 이내에 서버에서 명령을 시작해야 함을 의미
  • SSH 포트에 대한 액세스를 UDP 패킷이 전송된 IP에 대해서만 허용
  • 물론 SSH 포트가 인터넷에 노출되는 경우와 마찬가지로 다른 모든 보안 강화 작업도 수행해야 함
  • 설정 파일에 더 많은 명령을 추가하여 원하는 수의 명령을 정의할 수 있음