Google Cloud Run의 클라우드에서 Ubuntu 20.04.3 데스크톱을 실행하고 있습니다. 컨테이너 이미지를 로컬에서 실행하면 bash 터미널을 포함한 모든 프로세스를 실행할 수 있습니다.
하지만 noVNC를 통해 연결된 Google Cloud Run에서는 Chrome을 제외한 터미널이나 다른 프로세스를 시작할 수 없습니다. 그래서 몇 가지 다른 브라우저 기반 터미널 솔루션을 시도했고 이것이 제가 찾은 것입니다.
Node.js에서 Spawn 사용
Spawn과 리버스 쉘 Node.js 웹 서버를 사용하여 터미널 명령을 전달할 수 있습니다. 예를 들어, localhost:xxxx/exec?q=ls는 현재 작업 디렉터리에 있는 파일을 나열합니다. 명령을 실행할 수도 있습니다.
WebSSH2 및 shellinabox
두 솔루션 모두 SSH를 사용하여 브라우저 클라이언트를 SSH 서버에 연결합니다. 로그인할 수 있지만 명령을 실행하면 다음과 같은 출력이 표시됩니다.
root@localhost:~# ls
[1] stopped ls --color=auto
root@localhost:~# ls
보시다시피 루트로 SSHing을 시도했지만 Node.js의 generate 메서드를 사용하여 셸 명령을 실행하지 않는 한 여전히 어떤 명령도 실행할 수 없습니다.
상황에 맞게 Ubuntu, fluxbox, xvfb를 로컬로 실행하고 noVNC를 사용하여 브라우저를 통해 데스크톱에 액세스하는 모습은 다음과 같습니다. 로컬에서는 모든 것이 잘 작동합니다. ls
홈 폴더에서 실행하여 거기에 어떤 파일이 있는지 확인할 수 있습니다.
Google Cloud Run에서 동일한 이미지를 실행하면 나타나는 모습입니다. 이 ls
명령은 다음만 반환합니다 stopped [1]
.
Node.js 리버스 쉘의 모습은 다음과 같습니다. 여기서는 ls
/usr/bin 폴더에서 실행할 수 있음을 알 수 있습니다 . 이것이 파일 시스템을 탐색하고 어떤 권한이 설정되어 있는지 확인하고 Google Cloud Run에서 실행되는 컨테이너에 명령을 실행할 수 있는 유일한 방법입니다.
Node.js 역방향 프록시를 사용하여 파일에 대한 권한을 완화하더라도 WebSSH2 또는 shellinabox를 사용할 때처럼 명령을 chmod -R 777 /usr
실행할 수 없습니다 .ls
쉘 명령과 프로세스가 심지어 루트로서 실행되는 것을 막을 수 있는 것은 무엇입니까?