본문 바로가기
카테고리 없음

[linux] X Window System(X11) - 이해하기 쉽게

by 플랜비BB 2024. 8. 1.
흔히 X11, X 라고 알려져 있는 유닉스 계열 운영체제에서 사용되는 GUI 프레임워크이다. 기존의 디스플레이 시스템과 다른 점은 네트워크 프로토콜을 기반한 클라이언트/서버 모델이다. 예를 들어, 로컬 시스템에는 파이어폭스가 설치되있지 않더라도 다른 원격 시스템에 파이어폭스가 설치되어 있다면 원격 시스템에 네트워크로 접속하여 파이어폭스를 실행하면 로컬 서버의 디스플레이에서 출력이 가능하다.

 

1. 클라이언트 / 서버

일반적으로 서비스를 요구하는 쪽클라이언트, 제공하는 쪽이 서버라 정의한다. 하지만, X 에서는 입출력을 담당하는 로컬상의 소프트웨어가 서버이고, 원격 시스템의 어플리케이션이 클라이언트이다.(X 에서는 반대로 생각하면 됨)

클라이언트와 서버는 동일한 기기에서 실행될 수도 있고, 서로 다른 아키텍처와 운영 체제를 가진 다른 기기에서 실행될 수도 있다. 클라이언트와 서버는 암호화된 네트워크 세션을 통해 연결을 터널링하여 인터넷을 통해서도 안전하게 통신할 수 있다.

 

- SSH

X 서버와 원격 X 클라이언트 간의 네트워크 트래픽은 기본적으로 암호화되지 않는다. 패킷 스니퍼를 가진 공격자는 이를 가로챌 수 있어 사용자의 화면에 표시되거나 전송되는 모든 것을 볼 수 있다. X 트래픽을 암호화하는 가장 일반적인 방법은 통신을 위한 Secure Shell (SSH) 터널을 설정하는 것이다. (X 는 SSH을 사용)

 

- X Server

X 서버는 디스플레이의 그래픽 출력을 관리하고, 마우스와 키보드의 입력을 통해 그래픽 어플리케이션 조작이 가능하다. ( 원격 시스템에 접속하여 조작가능)

 

- PORT

X Server (로컬 시스템) 사용 포트 6000 확인

-- 윈도우 CMD
-- MobaXterm 소프트웨어의 X Server 기능 OFF
> netstat -na |findstr LIST |findstr 6000
TCP    127.0.0.1:6000         0.0.0.0:0              LISTENING

> netstat -na |findstr ESTAB |findstr 6000
(결과 없음)

-- MobaXterm 소프트웨어의 X Server 기능 ON
> netstat -na |findstr LIST |findstr 6000
TCP    0.0.0.0:6000           0.0.0.0:0              LISTENING

> netstat -na |findstr ESTAB |findstr 6000
TCP    127.0.0.1:6000         127.0.0.1:61423        ESTABLISHED
TCP    127.0.0.1:6000         127.0.0.1:61424        ESTABLISHED
TCP    127.0.0.1:6000         127.0.0.1:61425        ESTABLISHED
TCP    127.0.0.1:61423        127.0.0.1:6000         ESTABLISHED
TCP    127.0.0.1:61424        127.0.0.1:6000         ESTABLISHED
TCP    127.0.0.1:61425        127.0.0.1:6000         ESTABLISHED

 

X Client (원격 시스템) 사용 포트 6010 ~ 확인

-- 원격 리눅스에 MobaXterm 으로 접속
# netstat -tuln
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN

-- 원격 리눅스에 MobaXterm 으로 추가 접속
# netstat -tuln
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN

-- 다른 로컬 시스템에서 원격 리눅스에 MobaXterm 으로 추가 접속
# netstat -tuln
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:6012          0.0.0.0:*               LISTEN

 

- X 프로토콜

X 서버와 X 클라이언트 간의 통신을 위한 프로토콜 중에서 가장 최근 버전은 X11이다. 그래픽 데이터를 전송하고 윈도우 관리 명령어를 처리하는데 사용한다.

 

- X.org

X 서버를 구현하는 오픈소스 프로젝트이다. 현재는 대부분의 배포판이 X.org를 채택한다.
(MobaXterm X server and SSH client Embedded X server : Fully configured Xserver based on X.org)

 

- XLib/XCB

X 프로그래밍을 위한 라이브러리이다.

 

2. X 접근 제어

- DISPLAY 환경변수

환경변수는 프로세스가 컴퓨터에서 동작하는 방식에 영향을 주는 동적인 값이다. 쉘에서 정의되고 실행하는 동안 현재 X Window Display 위치를 지정할 수 있다.

 

-- DISPLAY 환경변수 조회
$ echo $DISPLAY
localhost:11.0
// X Server가 실행중이여야 조회가 가능함
// MobaXterm는 조회가 되지만 SecureCRT로는 조회 되지 않음

-- DISPLAY 환경변수 형식
// [hostname]:[디스플레이번호].[스크린번호]
$ export DISPLAY=192.168.56.101:0.0

 

- xhost

X 는 기본적으로 X 서버와 같은 단말기에서 동작하는 X 애플리케이션 표시만을 허가 때문에 다른 단말기에서의 접속을 허가하려면 다음과 같이 설정이 필요하다.

 

$ xhost +        // X 서버에 모든 클라이언트 접속을 허용
$ xhost -        // X 서버에 모든 클라이언트 접속을 금지
$ xhost + IP주소 // 해당 IP주소를 가진 호스트 접속 허용
$ xhost - IP주소 // 해당 IP주소를 가진 호스트 접속 금지
$ xhost          // 현재 액세스 제어 상태를 확인하고 싶으면 옵션없이

 

- xauth

xhost 가 호스트 기반 인증 방식을 사용하는 유틸릴티라면, xauth는 MMC방식(MIT-MAGIC-COOKIE)의 인증 방식을 사용하는 유틸리티이다.

 

$ xauth list
$ xauth add
$ xauth remove

-- Xauthority File
xauth 는 .Xauthority 파일에 "MAGIC COOKIE" 내용을 추가, 삭제한다.
이 값을 기반으로 사용자 인증을 하고, 인증된 사용자만 X 서버 이용이 가능하다

-- Xauthority File 생성
새롭게 OS 유저 생성 이후 SSH 접속 (SecureCRT)
$ ls -alrt
...
// SecureCRT로 접속했을 때는 Xauthority 파일이 생성 안됨

새롭게 OS 유저 생성 이후 SSH 접속 (MobaXterm)
/usr/bin/xauth:  file /home/oracle3/.Xauthority does not exist

$ ls -alrt
-rw-------. 1 oracle3 oracle3  52 Jul 16 10:53 .Xauthority
// Xauthority 파일이 생성됨

 

- 매직 쿠키

사용자를 식별하거나 세션을 유지하기 위해 클라이언트와 서버 간에 주고받는 데이터로 주로 인증 및 보안에서 사용된다. SSH 세션이 추가될 때마다 해당 유저의 XAUTHORITY 파일에 /bin/xauth가 MMC(MIT Magic Cookie)를 등록한다. 세션이 닫혀도 값은 그대로 유지된다.

 

$ xauth list
ORA11g/unix:11  MIT-MAGIC-COOKIE-1  bbae05c8b324222a77ef763210a55c61
ORA11g/unix:10  MIT-MAGIC-COOKIE-1  b32464289723f98ccc92da7b4fb930ca
ORA11g/unix:12  MIT-MAGIC-COOKIE-1  e77b31a473be035a00331c40abd0f139
ORA11g/unix:13  MIT-MAGIC-COOKIE-1  717852c4a9b309f043d2f9d9f16fab1d

// unix:10에서 10은 디스플레이 번호
// 0~9번 로컬 디스플레이, 10번부터 X11 디스플레이
// SecureCRT으로 세션을 추가하면 쿠키 값이 추가되지 않고, MobaXterm 만 쿠키 값이 추가됨

 

- X11Forwarding

원격 서버에서 실행되는 그래픽 애플리케이션을 로컬 머신에서 실행된 것처럼 볼 수 있게 만드는 설정이다.

 

-- 리눅스 환경
# vi /etc/ssh/sshd_config
X11Forwarding yes

-- 유닉스 환경(HP-UX)
# vi /etc/opt/ssh/sshd_config
X11Forwarding yes

-- X11Forwarding no
$ echo $DISPLAY
(아무것도 안나옴)

-- X11Forwarding yes
$ echo $DISPLAY
localhost:10.0

 

3. 사용자별로 생성되는 매직쿠키 확인

사용자별로 XAUTHORITY 파일이 별도로 존재하기 때문에 사용자별로 매직쿠키값을 따로 가지고 있다.

- 오라클 사용자에서 루트 사용자로 전환

$ echo $DISPLAY
localhost:10.0

$ xauth list
ORA11g/unix:12  MIT-MAGIC-COOKIE-1  e77b31a473be035a00331c40abd0f139
ORA11g/unix:13  MIT-MAGIC-COOKIE-1  717852c4a9b309f043d2f9d9f16fab1d
ORA11g/unix:14  MIT-MAGIC-COOKIE-1  54834a8dbecb16e5e82da31c0917f976
ORA11g/unix:11  MIT-MAGIC-COOKIE-1  a5b2200423cd5fd63bcf3b2efaab1559
ORA11g/unix:10  MIT-MAGIC-COOKIE-1  d2b81b8d1fde2b5858dd0bd295b68524 -> 현재 세션 매직쿠키값
$ su -
# echo $DISPLAY
localhost:10.0

# xauth list
ORA11g/unix:10  MIT-MAGIC-COOKIE-1  d2b81b8d1fde2b5858dd0bd295b68524
// 유저를 전환하더라도 오라클 사용자 세션의 매직쿠키값을 그대로 들고옴
// xclock 실행이 가능함

 

- 루트 사용자에서 오라클 사용자로 전환

# echo $DISPLAY
localhost:11.0

# xauth list
ORA11g/unix:15  MIT-MAGIC-COOKIE-1  714baef0549449ebe8ff0e0c8331a5df
ORA11g/unix:12  MIT-MAGIC-COOKIE-1  c07ab9583cac9452a109c769e47138a7
ORA11g/unix:13  MIT-MAGIC-COOKIE-1  d46ae23278e743fd73b66552e707eee2
ORA11g/unix:10  MIT-MAGIC-COOKIE-1  e12ed456785bff7ae42d3326c4404343
ORA11g/unix:11  MIT-MAGIC-COOKIE-1  c5eb492a9417acc50ae268ccf9134199 -> 현재 세션 매직쿠키값
# su - oracle
$ echo $DISPLAY
(아무것도 안나옴)

$ xauth list
ORA11g/unix:12  MIT-MAGIC-COOKIE-1  e77b31a473be035a00331c40abd0f139
ORA11g/unix:13  MIT-MAGIC-COOKIE-1  717852c4a9b309f043d2f9d9f16fab1d
ORA11g/unix:14  MIT-MAGIC-COOKIE-1  54834a8dbecb16e5e82da31c0917f976
ORA11g/unix:11  MIT-MAGIC-COOKIE-1  a5b2200423cd5fd63bcf3b2efaab1559
ORA11g/unix:10  MIT-MAGIC-COOKIE-1  d2b81b8d1fde2b5858dd0bd295b68524
// 유저 전환시, 이전 세션의 매직쿠키값을 들고 오지 않음
// xclock 실행 불가능

 

- 매직 쿠키값 추가

-- 루트 사용자 접속
# echo $DISPLAY
localhost:11.0

-- 현재 매직쿠키값 확인
# echo xauth add `xauth list ${DISPLAY#localhost}`
xauth add ORA11g/unix:11 MIT-MAGIC-COOKIE-1 c5eb492a9417acc50ae268ccf9134199

# su - oracle
$ xclock
Error: Can't open display:

$ export DISPLAY=localhost:11.0
$ xauth add ORA11g/unix:11 MIT-MAGIC-COOKIE-1 c5eb492a9417acc50ae268ccf9134199
$ xclock
// 쿠키값을 추가해줬기 때문에 xclock 실행가능