본문 바로가기

개발

Windows·Linux에서 시스템 권한을 다루는 올바른 아키텍처 설계

들어가며

애플리케이션을 개발하는 초창기라면 관리자 권한이 필요한 기능에 대해 마주치게 된다.

나는 이번에 PC의 시간과 임베디드 장치의 시간을 맞추는 "시간 동기화" 기능 구현업무를 담당하면서, 시스템 시간을 변경할 때 관리자 권한에 대해 공부했다.

공부한 내용을 바탕으로 Windows와 Linux에서 권고하는 애플리케이션의 권한사용은 어떤 건지,Root권한을 요구하는 "시스템 시간을 변경기능" 을 가지고 정리해 보자.

권한에 대해

시스템 시간 변경이 동작하도록 하는 제일 간단하지만 잘못된 방법은 애플리케이션을 관리자 권한으로 실행하는 방법이다.

실제로 CMD에서 시간 변경 명령어를 수행하게 한 다음, 애플리케이션을 실행할 때 관리자 권한으로 실행하게 하면 시스템 시간을 변경할 수 있다.

QProcess::execute("cmd.exe", {"/c", "time 12:34:56"});

위 코드는 "최소한의 접근 허용"에 맞지 않는다. 실제로 관리자 권한으로 실행된 애플리케이션이라면, 시스템 파일을 삭제하거나 PC설정을 변경해 백도어 프로그램을 실행하는 등의 작업이 가능하다. 내가 만든 앱을 해킹한다면 보안이슈로 이어질 것이다.

따라서 Windows나 Linux에서 권한은 최소한의 접근만 허용하도록 개발해야한다.

제일 적절한 구조는 Application은 사용자 권한을 가지고, 관리자 권한으로 최소한의 역할(시스템 시간 변경)기능만 가진 다른 프로그램을 개발하는 것이다. 

이때 최소한의 역할(시스템 시간 변경)을 하는 프로그램은 GUI 없이 백그라운드에서 실행돼도 상관없을 것이다.
이러한 특성의 프로그램을 Windows에서는 Service, Linux에서는 Daemon 라고 한다.

시스템 구조 설계 (System Architecture)

공부를 마치고 위 권한을 고려하면서 설계를 들어갔다. 팀원들과 공유하기 쉽게 다이어그램을 그렸다.

다이어그램을 그리니 Task를 작게 분리할수 있었고, 구현해야 하는 기능과 우선순위가 명확해진다.

System Architecture Diagram

우리 회사는 TOP와 LCMT 임베디드 장치를 개발한다. 시스템시간은 FW(Firmware) API를 이용해 설정하거나 불러올 수 있다.

Windows와 Linux인 경우는 살짝 복잡하다. 우선 System권한으로 실행되는 서비스를 개발해야 하며 Application과 요청 및 응답 기능을 IPC통신으로  구현해야 한다.

하지만 Service와 Daemon이 없다면 읽기 기능만 수행(그림과 같이)함으로써 태스크를 분리해 TODO에 추가할 수 있다.

  *팀 회의에서 Service와 Daemon을 뒤로 미루자고 어필 했지만 내가 하게 됐다... 하는 김에 깔끔하게...

최종적으로 사용자 Interface로 SetTime 요청 및 GetTime 요청을 할 수 있도록 지원하면 시간 동기화 기능을 구현할 수 있다.

NTP Client 시간 동기화

NTP Client란 네트워크로 연결된 NTP Server에서 시간을 읽어오는 기능을 하는 클라이언트이다.

"시간 동기화 기능"을 공부하면서 현재 진행중인 프로젝트에서도 언젠가 NTP Client를 지원해야겠구나 생각된다.

다이어그램을 추후 필요한 NTP Client기능을 포함하도록 확장시켜 보자.

System Architecture Diagram (+NTP Client)

추후 Application이 NTP Client를 가지는 구조로 가게된다면, 사용자는 인터페이스를 통해 Client설정을 할 수 있어야 한다.

그렇게 실행된 NTP Client는 일정시간 (ex. 1분) 마다 NTP서버에서 시간정보를 읽어오게 되며, Service와 통신하며 임베디드 장치의 시간을 서버와 동기화할 수 있다.

회고

이번에 시간 동기화 기능을 설계하면서 다이어그램이 깔끔하게 나와서 뿌듯했다. 이직 후 새로운 시스템을 접해보니 큰 그림을 그리는 실력이 늘고있는걸 느낀다.

이전에는 막연하게 애플리케이션에 관리자 권한이 필요할 때 주면 된다고 생각했다.

누군가는 "관리자권한으로 실행하면 되지, 시간하나 바꾸자고 저렇게 해?"라고 충분히 생각할 수 있다. 특히 TDD에서 말하는 "일단 돌아가는 프로그램을 작성한다"는 점과 프로젝트의 상황을 고려하면 관리자 권한을 주는 것이 더 효율 적일 수 있다고 생각한다.

하지만 OS가 권한을 만들어둔 의미와 보안권고사항을 생각해봤고, 이 과정에서 많이 배울 수 있었다.

코드가 깔끔한것을 넘어서 깔끔한 아키텍처란 무엇인가 느낄 수 있는 공부였다.