# MTail para Windows

O pacote contém um cliente MTail nativo e instala o Tailscale `1.102.3`
oficial como engine de rede. O serviço Windows `Tailscale` passa a ser dedicado
a uma única célula MTail; o instalador recusa serviço, pacote ou políticas
Tailscale preexistentes para não substituir silenciosamente outra rede.

## Requisitos

- Windows 10 ou Windows Server 2016, ou posterior;
- processador amd64 ou arm64 e o ZIP correspondente;
- PowerShell 5.1 aberto como Administrador;
- URL HTTPS do control plane e uma pre-auth key Headscale curta com
  `tag:mtail`, armazenada em arquivo quando houver enrollment.

Os executáveis deste repositório não são assinados. Antes de distribuição
pública de produção, assine `mtail.exe`, os scripts e o arquivo ZIP com a
identidade de publicação da organização. O MSI do engine é baixado do
repositório oficial e validado por SHA-256 pinado.

## Instalação

Extraia o ZIP, abra PowerShell como Administrador e execute:

```powershell
Unblock-File .\Install-MTail.ps1, .\Uninstall-MTail.ps1, .\mtail.exe
.\Install-MTail.ps1 -ControlUrl https://mtail.example.com
```

Para instalar e ingressar na mesma operação:

```powershell
.\Install-MTail.ps1 `
  -ControlUrl https://mtail.example.com `
  -TokenFile C:\segredos\mtail.token `
  -DeleteToken
```

O instalador:

1. exige privilégios administrativos e uma arquitetura suportada;
2. recusa Tailscale ou políticas preexistentes, salvo reparo de uma instalação
   marcada como pertencente ao MTail;
3. baixa o MSI `1.102.3` amd64/arm64 e confere seu hash oficial pinado;
4. força control URL, unattended mode, ausência de auto-update e defaults de
   rota/DNS compatíveis com MTail;
5. instala `mtail.exe` em `C:\Program Files\MTail`, adiciona-o ao PATH do
   computador e registra o desinstalador em Aplicativos Instalados.

Abra um novo terminal depois da instalação para obter o PATH atualizado.

## Enrollment posterior

Proteja a ACL e ingresse sem colocar o valor do token no histórico ou na linha
de comando:

```powershell
mtail token-protect C:\segredos\mtail.token
mtail join `
  --control=https://mtail.example.com `
  --token-file=C:\segredos\mtail.token `
  --delete-token
```

`token-protect` remove herança e permite acesso somente a
`BUILTIN\Administrators` e `LOCAL_SYSTEM`. `join` rejeita links/reparse points,
arquivo vazio, arquivo maior que 16 KiB, proprietário ou ACL inseguros. O
engine recebe apenas `--auth-key=file:CAMINHO`, nunca o conteúdo do token.
Antes de chamar o engine, o MTail copia o conteúdo pelo handle já validado para
um arquivo temporário em `C:\ProgramData\MTail\secrets`, diretório acessível
somente por Administradores e SYSTEM. Isso evita reabrir o caminho original em
um diretório controlado por outro usuário; a cópia é apagada em qualquer saída.

## Operação

```powershell
mtail status
mtail ip
mtail ping outro-no
mtail netcheck
mtail down
mtail leave
```

`down` é temporário. `leave` executa logout e exige novo token para retornar.

## Remoção

Em PowerShell como Administrador:

```powershell
& 'C:\Program Files\MTail\Uninstall-MTail.ps1'
```

O desinstalador usa o mesmo MSI guardado durante a instalação, remove somente
políticas ainda iguais aos valores gerenciados pelo MTail e não apaga
intencionalmente o estado do engine. Para logout e remoção destrutiva do estado:

```powershell
& 'C:\Program Files\MTail\Uninstall-MTail.ps1' -PurgeState
```

Mesmo com `-PurgeState`, confirme no servidor que o nó foi expirado/revogado.

## Construção dos ZIPs

Em um host com Docker, `zip` e `shasum`:

```sh
./packaging/windows/build-packages.sh
```

O build usa Go `1.26.7` pinado em container e cria os ZIPs amd64/arm64 mais o
arquivo de checksums em `packaging/windows/dist/`. Os ZIPs usam mtimes fixos e
não incluem atributos estendidos, produzindo o mesmo SHA-256 para o mesmo
código, versão e toolchain.
