enabling ssh to gitea #47
|
@ -95,3 +95,4 @@ playbooks/
|
||||||
/vaultwarden.yml
|
/vaultwarden.yml
|
||||||
/mirrors.yml
|
/mirrors.yml
|
||||||
/lb.yml
|
/lb.yml
|
||||||
|
/gitea-proxy.yml
|
||||||
|
|
|
@ -24,7 +24,7 @@ echo " roles:" >> private/playbooks/$1.yml
|
||||||
echo " - $1" >> private/playbooks/$1.yml
|
echo " - $1" >> private/playbooks/$1.yml
|
||||||
|
|
||||||
ln -s private/playbooks/$1.yml .
|
ln -s private/playbooks/$1.yml .
|
||||||
echo "/${1}.yml\n" >> .gitignore
|
echo "/${1}.yml" >> .gitignore
|
||||||
|
|
||||||
(
|
(
|
||||||
cd private/
|
cd private/
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
- name: update known_hosts
|
||||||
|
command: "/usr/local/bin/update_known_hosts.sh"
|
||||||
|
become_user: "{{ gitea_user.username }}"
|
|
@ -0,0 +1,55 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
- name: template gitea config in sshd_config.d
|
||||||
|
template:
|
||||||
|
src: gitea.conf.j2
|
||||||
|
dest: /etc/ssh/sshd_config.d/gitea.conf
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
tags:
|
||||||
|
- sshd
|
||||||
|
- gitea
|
||||||
|
notify:
|
||||||
|
# - reload ssh
|
||||||
|
- restart ssh
|
||||||
|
|
||||||
|
- name: copy the ssh keys used for the ssh proxy (gitea manages authorized_keys)
|
||||||
|
copy:
|
||||||
|
src: "private/gitea/{{ item.name }}"
|
||||||
|
dest: "{{ gitea_user.home }}/.ssh/{{ item.name }}"
|
||||||
|
mode: "{{ item.mode }}"
|
||||||
|
owner: "{{ gitea_user.username }}"
|
||||||
|
group: "{{ gitea_user.username }}"
|
||||||
|
no_log: true
|
||||||
|
with_items:
|
||||||
|
- name: id_rsa
|
||||||
|
mode: "0600"
|
||||||
|
- name: id_rsa.pub
|
||||||
|
mode: "0644"
|
||||||
|
tags:
|
||||||
|
- sshd
|
||||||
|
- gitea
|
||||||
|
|
||||||
|
- name: template scripts for ssh proxy to gitea
|
||||||
|
template:
|
||||||
|
src: "{{ item.name }}.j2"
|
||||||
|
dest: "/usr/local/bin/{{ item.name }}"
|
||||||
|
owner: "{{ item.owner }}"
|
||||||
|
group: "{{ item.owner }}"
|
||||||
|
mode: "{{ item.mode }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.name }}"
|
||||||
|
with_items:
|
||||||
|
- name: update_known_hosts.sh
|
||||||
|
owner: "{{ gitea_user.username }}"
|
||||||
|
mode: '0750'
|
||||||
|
- name: gitea
|
||||||
|
owner: root
|
||||||
|
mode: '0755'
|
||||||
|
tags:
|
||||||
|
- sshd
|
||||||
|
- gitea
|
||||||
|
notify:
|
||||||
|
- update known_hosts
|
||||||
|
- restart ssh
|
|
@ -0,0 +1,3 @@
|
||||||
|
---
|
||||||
|
- import_tasks: gitea-proxy.yml
|
||||||
|
tags: gitea-proxy
|
|
@ -0,0 +1,14 @@
|
||||||
|
# {{ ansible_managed }}
|
||||||
|
|
||||||
|
Match User {{ gitea_user.username }}
|
||||||
|
AuthorizedKeysCommandUser {{ gitea_user.username }}
|
||||||
|
|
||||||
|
# this sshes to the gitea container, where it runs 'gitea keys': https://docs.gitea.io/en-us/command-line/#keys
|
||||||
|
# that generates an ssh authorized_file output, which the users key is checked against
|
||||||
|
AuthorizedKeysCommand /usr/bin/ssh -p {{ gitea_ssh_port }} {{ gitea_user.username }}@{{ gitea_host }} /usr/local/bin/gitea keys -e {{ gitea_user.username }} -u %u -t %t -k %k
|
||||||
|
|
||||||
|
# in the authorized_keys output from gitea, userse keys are prefixed with command="/usr/local/bin/gitea...", which needs
|
||||||
|
# to exist both inside of the container (its the path to the gitea binary), and on this system, where it is a wrapper
|
||||||
|
# script that ssh's to ssh on the gitea container.
|
||||||
|
#
|
||||||
|
# see: templates/gitea.j2
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# {{ ansible_managed }}
|
||||||
|
/usr/bin/ssh -p {{ gitea_ssh_port }} {{ gitea_user.username }}@{{ gitea_host }} "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# {{ ansible_managed }}
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
{% set known_hosts = gitea_user.home + "/.ssh/known_hosts" -%}
|
||||||
|
|
||||||
|
# remove keys for {{ gitea_host }}:{{ gitea_ssh_port }}
|
||||||
|
ssh-keygen -R [{{ gitea_host }}]:{{ gitea_ssh_port }} || true
|
||||||
|
rm -v {{ known_hosts }} || true
|
||||||
|
touch {{ known_hosts }}
|
||||||
|
|
||||||
|
# add to known_hosts
|
||||||
|
# not piping stderr (2>&1) because that tends to corrupt the file
|
||||||
|
{% for item in ["rsa", "ecdsa", "ed22519"] -%}
|
||||||
|
# ssh-keyscan -t rsa -p {{ gitea_ssh_port }} {{ gitea_host }} >> {{ known_hosts }}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
# hashed hostnames
|
||||||
|
ssh-keyscan -H -p {{ gitea_ssh_port }} {{ gitea_host }} >> {{ known_hosts }}
|
||||||
|
|
||||||
|
# hashed ip
|
||||||
|
IPADDR=$(host {{ gitea_host }} | awk '{print $4}')
|
||||||
|
ssh-keyscan -H -p {{ gitea_ssh_port }} ${IPADDR} >> {{ known_hosts }}
|
||||||
|
|
||||||
|
chmod 0600 {{ known_hosts }}
|
||||||
|
chown {{ gitea_user.uid }}:{{ gitea_user.gid }} {{ known_hosts }}
|
|
@ -55,32 +55,6 @@
|
||||||
tags:
|
tags:
|
||||||
- gitea-mirror
|
- gitea-mirror
|
||||||
|
|
||||||
- name: template ssh passthrough script
|
|
||||||
template:
|
|
||||||
src: ssh-passthrough.j2
|
|
||||||
dest: /usr/local/bin/gitea
|
|
||||||
mode: 0755
|
|
||||||
owner: git
|
|
||||||
group: git
|
|
||||||
when: gitea_ssh_enabled
|
|
||||||
tags:
|
|
||||||
- gitea-mirror
|
|
||||||
|
|
||||||
- name: copy the ssh keys used for the ssh shim (gitea manages authorized_keys)
|
|
||||||
copy:
|
|
||||||
src: "private/gitea/{{ item.name }}"
|
|
||||||
dest: "{{ gitea_user.home }}/.ssh/{{ item.name }}"
|
|
||||||
mode: "{{ item.mode }}"
|
|
||||||
owner: "{{ gitea_user.username }}"
|
|
||||||
group: "{{ gitea_user.username }}"
|
|
||||||
no_log: true
|
|
||||||
when: gitea_ssh_enabled
|
|
||||||
with_items:
|
|
||||||
- name: id_rsa
|
|
||||||
mode: "0600"
|
|
||||||
- name: id_rsa.pub
|
|
||||||
mode: "0644"
|
|
||||||
|
|
||||||
- name: template config
|
- name: template config
|
||||||
template:
|
template:
|
||||||
src: app.ini.j2
|
src: app.ini.j2
|
||||||
|
@ -177,7 +151,7 @@
|
||||||
state: "{{ container_state | default('started') }}"
|
state: "{{ container_state | default('started') }}"
|
||||||
container_default_behavior: compatibility
|
container_default_behavior: compatibility
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:{{ gitea_ssh_port }}:22"
|
- "{{ gitea_ssh_port }}:22"
|
||||||
volumes:
|
volumes:
|
||||||
- "{{ gitea_user.home }}/data:/data"
|
- "{{ gitea_user.home }}/data:/data"
|
||||||
- "{{ gitea_user.home }}/.ssh/:/data/git/.ssh"
|
- "{{ gitea_user.home }}/.ssh/:/data/git/.ssh"
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
ssh -o StrictHostKeyChecking=no git@{{ bridgewithdns.gitea }} "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- sshd
|
||||||
|
- gitea-proxy
|
||||||
|
- haproxy
|
|
@ -4,3 +4,8 @@
|
||||||
service:
|
service:
|
||||||
name: ssh
|
name: ssh
|
||||||
state: reloaded
|
state: reloaded
|
||||||
|
|
||||||
|
- name: restart ssh
|
||||||
|
service:
|
||||||
|
name: ssh
|
||||||
|
state: restarted
|
||||||
|
|
|
@ -6,17 +6,11 @@
|
||||||
|
|
||||||
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
# The strategy used for options in the default sshd_config shipped with
|
|
||||||
# OpenSSH is to specify options with their default value where
|
|
||||||
# possible, but leave them commented. Uncommented options override the
|
|
||||||
# default value.
|
|
||||||
|
|
||||||
Include /etc/ssh/sshd_config.d/*.conf
|
Port {{ sshd_port | default('22') }}
|
||||||
|
|
||||||
#Port 22
|
|
||||||
#AddressFamily any
|
#AddressFamily any
|
||||||
#ListenAddress 0.0.0.0
|
ListenAddress {{ sshd_listen_addr4 | default('0.0.0.0') }}
|
||||||
#ListenAddress ::
|
#ListenAddress {{ sshd_listen_addr6 | default('::') }}
|
||||||
|
|
||||||
#HostKey /etc/ssh/ssh_host_rsa_key
|
#HostKey /etc/ssh/ssh_host_rsa_key
|
||||||
#HostKey /etc/ssh/ssh_host_ecdsa_key
|
#HostKey /etc/ssh/ssh_host_ecdsa_key
|
||||||
|
@ -57,7 +51,6 @@ PermitRootLogin {{ sshd_permit_root_login | default('yes') }}
|
||||||
|
|
||||||
# To disable tunneled clear text passwords, change to no here!
|
# To disable tunneled clear text passwords, change to no here!
|
||||||
PasswordAuthentication no
|
PasswordAuthentication no
|
||||||
#PermitEmptyPasswords no
|
|
||||||
|
|
||||||
# Change to yes to enable challenge-response passwords (beware issues with
|
# Change to yes to enable challenge-response passwords (beware issues with
|
||||||
# some PAM modules and threads)
|
# some PAM modules and threads)
|
||||||
|
@ -122,4 +115,17 @@ Subsystem sftp /usr/lib/openssh/sftp-server
|
||||||
# AllowTcpForwarding no
|
# AllowTcpForwarding no
|
||||||
# PermitTTY no
|
# PermitTTY no
|
||||||
# ForceCommand cvs server
|
# ForceCommand cvs server
|
||||||
PasswordAuthentication no
|
|
||||||
|
|
||||||
|
# the include statement does not work as you would expect. theres a bug that makes Match rules
|
||||||
|
# included files igored:
|
||||||
|
# https://unix.stackexchange.com/questions/603224/sshd-config-using-a-match-statement-inside-an-included-file
|
||||||
|
#
|
||||||
|
# but the workaround proposed here seems to work (add "Match all" befure the "Include" statement to prevent
|
||||||
|
# the included match statements form being interpreted as parts of other statements):
|
||||||
|
# https://serverfault.com/a/1106224
|
||||||
|
#
|
||||||
|
# it also works to place the "Include" statment at the top of the file with this workaround.
|
||||||
|
|
||||||
|
Match all
|
||||||
|
Include /etc/ssh/sshd_config.d/*.conf
|
||||||
|
|
Loading…
Reference in New Issue