Seguridad

Cómo Instalar Gitea en FreeBSD usando AppJail Director

Manejar nuestros
proyectos de desarrollo es muy fácil actualmente, hay demasiados
servicios para escoger, con menos o con más características, pero hay
uno en particular, de código abierto, auto-hospedable, con muchísimas
características, y la mejor parte, que se puede instalar en FreeBSD. Ese
genial proyecto es Gitea, un software para hospedar nuestros proyectos
usando git, que además cuenta con funciones colaborativas como rastreo
de incidentes, revisión de código, integración continua, tickets y
wikis.

En este artículo instalaremos Gitea y PostgreSQL en FreeBSD usando AppJail Director.

Pasos preliminares

En mi sistema tengo la siguiente configuración:

/etc/rc.conf (Solo lo relevante es mostrado):

# AppJail
appjail_enable="YES"
appjail_dns_enable="YES"
# Recomendable if tu dirección IP cambia, entonces podremos usar la siguiente dirección IP en nuestras jaulas.
ifconfig_tap0_name="ajdns"
ifconfig_ajdns="inet 172.0.0.1/32"
# DNSMasq
dnsmasq_enable="YES"
dnsmasq_conf="/usr/local/share/appjail/files/dnsmasq.conf"
# Habilitar net.inet.ip.forwarding.
gateway_enable="YES"

/usr/local/etc/appjail/appjail.conf:

EXT_IF=jext
ON_IF=jext
FREEBSD_VERSION=14.0-RELEASE
FREEBSD_ARCH=amd64
IMAGE_ARCH=amd64
ENABLE_DEBUG=0
ENABLE_ZFS=1
SHORTEN_DOMAIN_NAMES=1
DEFAULT_RESOLV_CONF=/usr/local/etc/appjail/resolv.conf
/usr/local/etc/appjail/resolv.conf:
nameserver 172.0.0.1 

/etc/pf.conf:
nameserver 172.0.0nat-anchor 'appjail-nat/jail/*'
nat-anchor "appjail-nat/network/*"
rdr-anchor "appjail-rdr/*".1

Console Output:

# service appjail-dns status
appjail_dns is running as pid 97063.
# service dnsmasq status
dnsmasq is running as pid 98251.
# sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 1
# freebsd-version
14.0-RELEASE-p4
# uname -r
14.0-RELEASE-p4
# appjail version
3.0.0.20231220+9468250a2fb7e6f6e6f63a89eb0892e325d1cf83
# appjail-director --version
appjail-director, version 0.7.0
# zfs list zroot
NAME    USED  AVAIL  REFER  MOUNTPOINT
zroot  72.1G   531G    24K  none
# ifconfig ajdns
ajdns: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        ether 58:9c:fc:10:8e:0c
        inet 172.0.0.1 netmask 0xffffffff broadcast 172.0.0.1
        groups: tap
        media: Ethernet 1000baseT <full-duplex>
        status: no carrier
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
# ifconfig jext
jext: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=4e524bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6,HWSTATS,MEXTPG>
        ether 00:1b:24:e0:6d:a3
        inet 192.168.1.105 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

Estoy usando la versión de desarrollo de AppJail, por lo que estar atentos a la versión y al commit hash del que estén usando.

Nota: Mantener AppJail y Director actualizados y sincronizados.

La red virtual es la siguiente, pero en estos días no es necesario preocuparse por ella dado que AppJail la crea si no existe:

# appjail network list
NAME   NETWORK   CIDR  BROADCAST      GATEWAY   MINADDR   MAXADDR        ADDRESSES  DESCRIPTION
ajnet  10.0.0.0  10    10.63.255.255  10.0.0.1  10.0.0.1  10.63.255.254  4194302    AppJail network

Si necesitas más información, he aquí los lugares relevantes para este artículo en la documentación de AppJail:

*.- Introducción
*.- Configuración
*.- Introducción a las Redes Virtuales
*.- DNS

Desplegando Gitea

Como se explica en AppJail-makejails/gitea#basic-usage hay que pasar las variables de entorno de la siguiente forma:

1.- Las variables de entorno deben tener la siguiente forma: GITEA__SECTION_NAME__KEY_NAME.
2.- SECTION y KEY_NAME deben estar en mayúsculas. Pueden contener _ y números.
3.- _0X2E_ será remplazados por . y _0X2D_ por ..
4.- Para usar la sección global o predeterminada, usa DEFAULT como sección.

Por lo que nuestro archivo Director es el siguiente:

appjail-director.yml:

options:
  - virtualnet: ":<random> default"
  - nat:

services:
  gitea:
    name: gitea
    makejail: gh+AppJail-makejails/gitea
    options:
      - expose: 3000
      - expose: '2022:22'
      - copydir: !ENV '${PWD}/gitea/files'
      - file: /etc/rc.conf.local
    arguments:
      - gitea_tag: '14.0'
    environment:
      - GITEA__DATABASE__DB_TYPE: 'postgres'
      - GITEA__DATABASE__HOST: 'gitea-postgres:5432'
      - GITEA__DATABASE__NAME: 'gitea'
      - GITEA__DATABASE__USER: 'gitea'
      - GITEA__DATABASE__PASSWD: 'gitea'
      - GITEA__SERVER__SSH_PORT: 2022
      - GITEA__SERVER__DOMAIN: '192.168.1.105'
      - GITEA__DEFAULT__APP_NAME: 'Welcome to my git server!'
    volumes:
      - gitea-db: gitea-db
      - gitea-git: gitea-git

  db:
    name: gitea-postgres
    makejail: gh+AppJail-makejails/postgres
    options:
      - template: !ENV '${PWD}/postgres/template.conf'
    arguments:
      - postgres_tag: '14.0-16'
    environment:
      - POSTGRES_PASSWORD: 'gitea'
      - POSTGRES_USER: 'gitea'
      - POSTGRES_DB: 'gitea'
    volumes:
      - pg-done: pg-done
      - pg-data: pg-data

default_volume_type: '<volumefs>'

volumes:
  gitea-git:
    device: .volumes/gitea/git
  gitea-db:
    device: .volumes/gitea/db
  pg-data:
    device: .volumes/postgres/data
  pg-done:
    device: .volumes/postgres/done

.env:

DIRECTOR_PROJECT=gitea

postgres/template.conf:

exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
sysvmsg: new
sysvsem: new
sysvshm: new
mount.devfs

gitea/files/etc/rc.conf.local:

sshd_enable="YES"

Hay
muchas cosas que AppJail y Director realizan por nosotros en un solo
archivo pero lo explicaré en breve. Por el momento solo ejecutemos el
proyecto y veamos el resultado:
# appjail-director up
appjail-director up
Starting Director (project:gitea) ...
Creating db (gitea-postgres) ... Done.
Creating gitea (gitea) ... Done.
Finished: gitea
# appjail-director info
gitea:
 state: DONE
 last log: /root/.director/logs/2023-12-22_21h33m25s
 locked: false
 services:
  + db (gitea-postgres)
  + gitea (gitea)

Como se puede apreciar, solo un comando es lo que se usó para desplegar Gitea y PostgreSQL, pero si ingresamos a http://192.168.1.105:3000 en el navegador de otro sistema, Gitea no muestra nada. No hay de qué precouparse, veamos si el proceso está corriendo:

# appjail service jail gitea gitea status
gitea is running as pid 91657.

Después
de que Gitea se inicialice correctamente, podemos registrarnos, crear
un repositorio, o, por ejemplo, agregar nuestra clave SSH en Profile & Settings > Settings > SSH / GPG Keys.

 

Profile and Settings...

Profile and Settings…

 

SSH / GPG Keys
Concepto de efímero

Desde la página de inicio de Director:

Director
trata cada jaula como efímera. Esto no quiere decir que sus jaulas no
persistirán después de que las detengas o que su sistema se reinicie, lo
que quiere decir es que Director asume que es seguro destruir sus
jaulas ya que se ha separado los datos que deben persistir de los que
no.

Incluso si nuestras jaulas son un tipo de «Jaulas con estado«, esto no significa que no podamos usarlas como «Jaulas efímeras«.
La idea de tener jaulas efímeras es muy simple, pero tiene demasiadas
ventajas que probablemente quedarían mejor descritas en otro artículo:
los datos son separados en dos tipos, los que deben persistir de los que
no. Ya hemos hecho esto, por lo que si realizamos lo siguiente…

# appjail-director down -d
Starting Director (project:gitea) ...
Stopping gitea (gitea) ... Done.
Destroying gitea (gitea) ... Done.
Stopping db (gitea-postgres) ... Done.
Destroying db (gitea-postgres) ... Done.
Destroying gitea ... Done.
# appjail-director info
gitea: Project not found.

¡Nuestro proyecto se ha ido!
 
No te preocupes, esto es lo que solucionan los volúmenes:
# tree -L 2 .volumes
.volumes
├── gitea
│   ├── db
│   └── git
└── postgres
    ├── data
    └── done

7 directories, 0 files

Por lo que podremos crear nuestro proyecto otra vez (y los datos persistirán):

# appjail-director up
Starting Director (project:gitea) ...
Creating db (gitea-postgres) ... Done.
Creating gitea (gitea) ... Done.
Finished: gitea
# appjail-director info
gitea:
 state: DONE
 last log: /root/.director/logs/2023-12-22_21h51m23s
 locked: false
 services:
  + db (gitea-postgres)
  + gitea (gitea)

Y nuestras claves SSH estarán intactas:

# cat .volumes/gitea/git/.ssh/authorized_keys
# gitea public key
command="/usr/local/sbin/gitea --config=/usr/local/etc/gitea/conf/app.ini serv key-1",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG8B02AxX4CBRHNQHAwQIZUE454ZixeqSkAG7b9OOMxa dtxdf@dtxdf-laptop

Fuente: https://dtxdf.github.io/post/how-to-install-gitea-on-freebsd-using-appjail-director/

Contribución gracias a ~ DtxdF

Powered by WPeMatico

Gustavo Genez

Informático de corazón y apasionado por la tecnología. La misión de este blog es llegar a los usuarios y profesionales con información y trucos acerca de la Seguridad Informática.