Configura o SSH passthrough para o gitea #11

Merged
tcarrondo merged 1 commits from gitea-ssh-passthrough into master 2022-03-07 20:45:48 +00:00
Owner

Com o gitea está a correr num container, o acesso via ssh era feito pelo porto 2222 para não entrar em conflito com o ssh do servidor anfitrião.

Este PR configura o passthrough no anfitrião para que qualquer ligação feita ao utilizador git seja redireccionado para o container. Para isto funcionar, é preciso duas coisas:

Primeiro, é preciso passar as chaves públicas do gitea para o anfitrião para que utilizadores do gitea consigam autenticar no anfitrião. Isto foi feito com a directiva AuthorizedKeysCommand no /etc/ssh/sshd_config do anfitrião, que permite especificar um comando que imprime no stdout as chaves permitidas, em vez de apenas estarem estaticamente configuradas no ficheiro ~/.ssh/authorized_keys. O comando em questão é um lxc exec gitea -- gitea keys .... Este comando gera um conjunto de chaves autorizadas restritas ao comando /usr/local/bin/gitea.

Segundo, é preciso configurar um shim no anfitrião para que o tal comando /usr/local/bin/gitea funcione. Este shim limita-se a chamar exactamente o mesmo comando mas no contexto do container lxc.

Bati nalguns problemas enquanto fiz isto:

Primeiro, o AuthorizedKeysCommand corre com o utilizador especificado em AuthorizedKeysCommandUser. Especifiquei git aqui, e adicionei-o ao grupo lxd para poder fazer o lxc exec, mas um bug no openssh faz com que os grupos não sejam inicializados e o comando falhe. Para dar a volta a isto, para já, o comando está a correr como root. O bug já foi corrigido, quando sair a nova LTS 22.04 talvez possamos meter isto direito.

Segundo, para facilitar a gestão do sshd_config, ia criar um /etc/ssh/sshd_config.d/git.conf com as directivas AuthorizedKeys*, mas estas têm de estar por baixo de um Match User git para só se aplicarem a este utilizador, e havia um bug no openssh que ignora qualquer directiva Match em ficheiros incluídos. Para dar a volta a isto, adicionei as directivas directamente no ficheiro principal /etc/ssh/sshd_config. Isto implicou copiar na íntegra este ficheiro para o ansible, porque estar a fazer com que o ansible apenas gerisse 3 linhas no fim do ficheiro era mais trabalho que solução. A única alteração é o acrescentar de três linhas no fim do ficheiro, o resto copiei do servidor.

Terceiro, ao usar esta configuração de passthrough, o ssh embutido no gitea nem sequer é usado, mas ao tentar desligá-lo o gitea deixou de funcionar (tentava escrever os ficheiros de configuração de ssh nativos em sítios sem permissão). Deixei-o ligado mas desliguei o port mapping. Tentei também mudar o SSH_PORT para 22 para aparecer bem no interface, mas o gitea_ssh_port muda tanto o SSH_PORT como o SSH_LISTEN_PORT, e ao mudar este segundo o arranque falhava por falta de permissões para usar o porto 22 (o gitea corre sem privilégios). Para dar a volta a isto, meti umas configurações extra na secção gitea_extra_config. O mesmo para o SSH_USER.

Parece-me estar tudo a funcionar,

Com o gitea está a correr num container, o acesso via ssh era feito pelo porto 2222 para não entrar em conflito com o ssh do servidor anfitrião. Este PR configura o passthrough no anfitrião para que qualquer ligação feita ao utilizador git seja redireccionado para o container. Para isto funcionar, é preciso duas coisas: Primeiro, é preciso passar as chaves públicas do gitea para o anfitrião para que utilizadores do gitea consigam autenticar no anfitrião. Isto foi feito com a directiva `AuthorizedKeysCommand` no `/etc/ssh/sshd_config` do anfitrião, que permite especificar um comando que imprime no stdout as chaves permitidas, em vez de apenas estarem estaticamente configuradas no ficheiro ~/.ssh/authorized_keys. O comando em questão é um `lxc exec gitea -- gitea keys ...`. Este comando gera um conjunto de chaves autorizadas restritas ao comando `/usr/local/bin/gitea`. Segundo, é preciso configurar um shim no anfitrião para que o tal comando `/usr/local/bin/gitea` funcione. Este shim limita-se a chamar exactamente o mesmo comando mas no contexto do container lxc. Bati nalguns problemas enquanto fiz isto: Primeiro, o `AuthorizedKeysCommand` corre com o utilizador especificado em `AuthorizedKeysCommandUser`. Especifiquei `git` aqui, e adicionei-o ao grupo `lxd` para poder fazer o `lxc exec`, mas um [bug no openssh](https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/misc.c#rev1.170) faz com que os grupos não sejam inicializados e o comando falhe. Para dar a volta a isto, para já, o comando está a correr como `root`. O bug já foi corrigido, quando sair a nova LTS 22.04 talvez possamos meter isto direito. Segundo, para facilitar a gestão do sshd_config, ia criar um `/etc/ssh/sshd_config.d/git.conf` com as directivas `AuthorizedKeys*`, mas estas têm de estar por baixo de um `Match User git` para só se aplicarem a este utilizador, e havia um bug no openssh que ignora qualquer directiva `Match` em ficheiros incluídos. Para dar a volta a isto, adicionei as directivas directamente no ficheiro principal `/etc/ssh/sshd_config`. Isto implicou copiar na íntegra este ficheiro para o ansible, porque estar a fazer com que o ansible apenas gerisse 3 linhas no fim do ficheiro era mais trabalho que solução. A única alteração é o acrescentar de três linhas no fim do ficheiro, o resto copiei do servidor. Terceiro, ao usar esta configuração de passthrough, o ssh embutido no gitea nem sequer é usado, mas ao tentar desligá-lo o gitea deixou de funcionar (tentava escrever os ficheiros de configuração de ssh nativos em sítios sem permissão). Deixei-o ligado mas desliguei o port mapping. Tentei também mudar o SSH_PORT para 22 para aparecer bem no interface, mas o `gitea_ssh_port` muda tanto o SSH_PORT como o `SSH_LISTEN_PORT`, e ao mudar este segundo o arranque falhava por falta de permissões para usar o porto 22 (o gitea corre sem privilégios). Para dar a volta a isto, meti umas configurações extra na secção `gitea_extra_config`. O mesmo para o `SSH_USER`. Parece-me estar tudo a funcionar,
hugopeixoto added 1 commit 2022-03-07 20:34:07 +00:00
hugopeixoto force-pushed gitea-ssh-passthrough from 3c9dcacaeb to 1c13397fcc 2022-03-07 20:42:12 +00:00 Compare
hugopeixoto force-pushed gitea-ssh-passthrough from 1c13397fcc to 256f4066d1 2022-03-07 20:44:54 +00:00 Compare
tcarrondo merged commit 54b55f45d2 into master 2022-03-07 20:45:48 +00:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: ansol/ansible#11
No description provided.