• This repository has been archived on 18/Sep/2020
  • Stars
    star
    208
  • Rank 182,913 (Top 4 %)
  • Language
    Rust
  • License
    GNU Lesser Genera...
  • Created about 6 years ago
  • Updated over 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

YubiHSM2-backed signing server

fero

fero is a secure signing server built around the YubiHSM2. fero maintains a set of private RSA keys in the YubiHSM and uses them to produce PGP (or PKCS#1v1.5) signatures when an authorized signing request is received. It is designed to be a replacement for manual signing processes with gpg or openssl rsautl -sign.

Model

fero makes a distinction between private keys it manages (called "secrets") and public keys which can be used to manage and use secrets (called "users"). Each secret has its own numerical threshold for performing signing or management operations, and each user has a weight for each individual secret. Thus, signing permissions can be controlled highly granularly - each user is explicitly granted fractional control over any secrets they may have access to. This level of granularity can also be used to build a signing hierarchy - a project with artifacts produced by several different teams but signed by a single secret can assign weights for the top-level secret only to team-level secrets which are also stored in fero. Individual team members are then assigned weight for their team's secret only, and when all teams have individually signed an artifact, the top-level secret can then be used to re-sign the artifact.

Signing and online management operations with fero all follow the same basic workflow:

  • The payload is generated.
    • For signing operations, this is the actual artifact to sign.
    • For management operations, this is a specially formatted payload generated with the fero command-line client.
  • Each user who wishes to authorize the operation signs the payload with their public key.
  • The user signatures are collected and submitted by a single party along with the actual request to perform the operation.
  • The fero server verifies each submitted user signature, and sums their weights for the requested secret.
  • If the secret's threshold is met or exceeded, the fero server performs the operation and returns any artifact produced by the operation.
    • For signing operations, this is the signature by the secret over the payload.
    • For management operations, there is no artifact produced.

Deployment

Structure and requirements

fero is intended to be deployed on a machine which is not directly connected to the Internet. To that end, there are three components to fero:

  • The fero server. This is run on a non-Internet-connected machine with the YubiHSM2 present.
  • The fero bastion. This is run on a machine with limited network access that must also have access to the non-Internet-connected server machine. It acts as a simple proxy between clients and the server.
  • The fero client. This is run by fero users on any machine with access to the fero bastion.

The fero server requires a system with libyubihsm.so from the YubiHSM2 SDK installed, and a YubiHSM2 device attached to the system.

Setup

Both of these methods assume you are starting with a YubiHSM2 in the factory-default configuration. If not, you should reset your YubiHSM2.

Containerized setup (recommended)

On the fero-server host:

  1. Preload the fero-server and yubihsm-connector Docker images onto the host. These can be built from fero-server/Dockerfile and fero-server/Dockerfile.connector, respectively.
  2. Configure a Docker bridge network over which the connector and server can communicate:
docker network create --driver bridge fero
  1. Create a container for the connector:
docker create --name yubihsm-connector --network fero -v /dev:/dev --privileged=true yubihsm-connector
docker start yubihsm-connector
  1. Provision the YubiHSM2 via fero-server's provision command:
docker run -it --rm --network fero -v ${FERO_DATA_PATH}:/fero fero-server provision -y

You will be prompted for two passwords, one for the new administrative AuthKey that will be created on the YubiHSM2 and one for the application AuthKey that fero-server will use.

  1. Create and run the fero-server container:
docker create --name fero-server --network fero -v ${FERO_DATA_PATH}:/fero -t fero-server serve -k 3 -w $YOUR_APP_PASSWORD
docker start fero-server
  1. Add secrets and users as desired (see "Management" section).

On the fero-bastion host:

  1. Preload the fero-bastion Docker image onto the host. This can be built from fero-bastion/Dockerfile.
  2. Create and run the fero-bastion container:
docker create --name fero-bastion -t fero-bastion --server-address $FERO_SERVER_ADDRESS
docker start fero-bastion

Non-containerized setup

On the fero-server host:

  1. Configure yubihsm-connector. Make a note of its settings, as you'll need to tell fero-server about them.
  2. If you haven't already configured your YubiHSM2, do so now with fero-server -d /path/to/fero.db provision -y. Make a note of both passwords you enter here; you'll need the administrative AuthKey if you ever need to reconfigure the YubiHSM2, and you'll need the application AuthKey to use fero.
  3. Start fero-server with the options you've noted from the previous steps, and the desired address/port to listen on: fero-server -d /path/to/fero.db serve -a ${LISTEN_ADDR} -k 3 -w ${APPLICATION_PASSWORD} -c ${CONNECTOR_URL} -p ${LISTEN_PORT}

On the fero-bastion host:

  1. Run fero-bastion -a ${BASTION_LISTEN_ADDRESS} -p ${BASTION_LISTEN_PORT} -s ${SERVER_LISTEN_ADDRESS} -r ${SERVER_LISTEN_PORT}.

Management

The examples given are for use with the containerized setup listed above. If you're not using the containerized setup, just drop the Docker portions of the examples and run fero-server directly. You will also need to provide the connector URL and database path.

Secrets

Fero supports both PGP and raw RSA private keys. Secrets can be added with either add-pgp-secret or add-pem-secret, depending on the type of secret you wish to add. Each also requires the AuthKey and database path. For PGP secrets, you will also need to specify which subkey you wish to store.

Important: Fero does not support ASCII-armored PGP data, so if your private key is ASCII-armored you will need to dearmor it (gpg2 --dearmor armored_key.gpg > dearmored_key.gpg).

  • PEM secrets:
docker run -it --rm --network fero \
    -v ${FERO_DATA_PATH}:/fero -v $(pwd):/data fero-server add-pem-secret \
    -k 3 -w $YOUR_APP_PASSWORD \
    --name $SECRET_NAME \
    --threshold $SECRET_THRESHOLD \
    --file path/to/some.pem
  • PGP secrets:
docker run -it --rm --network fero \
    -v ${FERO_DATA_PATH}:/fero -v $(pwd):/data fero-server add-pgp-secret \
    -k 3 -w $YOUR_APP_PASSWORD \
    --name $SECRET_NAME \
    --threshold $SECRET_THRESHOLD \
    --subkey $DESIRED_SUBKEY \
    --file path/to/some_private_key.pgp

Users

Adding users can be done with the add-user subcommand.

Important: Fero does not support ASCII-armored PGP data, so if your public key is ASCII-armored you will need to dearmor it (gpg2 --dearmor armored_key.gpg > dearmored_key.gpg).

docker run -it --rm --network fero \
    -v ${FERO_DATA_PATH}:/fero -v $(pwd):/data fero-server add-user \
    -k 3 -w $YOUR_APP_PASSWORD \
    --file path/to/some_public_key.pgp

Setting a user's weight for a key can be done with the set-user-weight subcommand:

docker run -it --rm --network fero \
    -v ${FERO_DATA_PATH}:/fero fero-server set-user-weight \
    --name $SECRET_NAME
    --user $USER_PGP_FINGERPRINT \
    --weight $NEW_WEIGHT

Usage

Signing

Once you've populated the server with your secrets and users, and set the appropriate weights and thresholds, signing is relatively straightforward. Simply use the sign subcommand of fero-client along with each user's signature:

fero-client -a $BASTION_ADDRESS sign \
    -f myfile.txt \
    -o myfile.txt.sig \
    -k mysecret \
    -s myfile.txt.sig.1 -s myfile.txt.sig.2 -s myfile.txt.sig.3

For PKCS signatures, there's a little more work to do. Fero expects the "file" for PKCS signatures to be the actual SHA256 hash of the content you're signing:

openssl dgst -sha256 -out myfile.txt.hash myfile.txt
# Sign myfile.txt.hash as normal
fero-client -a $BASTION_ADDRESS sign \
    -f myfile.txt.hash \
    -o myfile.txt.sig \
    -k mysecret \
    -s myfile.txt.sig.1 -s myfile.txt.sig.2 -s myfile.txt.sig.3

User/secret management

Key management operations use the same authentication method as signing operations, so any set of users which can sign with a given key can also manage it. fero-client includes subcommands for generating the appropriate payloads to sign for the various key management operations.

Setting secret thresholds

fero-client -a $BASTION_ADDRESS threshold-payload -f threshold_payload -k mysecret -t 1000
# Sign threshold_payload
fero-client -a $BASTION_ADDRESS threshold -k mysecret -t 1000 \
    -s threshold_payload.sig.1 -s threshold_payload.sig.2 -s threshold_payload.sig.3

Updating users' weights

fero-client -a $BASTION_ADDRESS weight-payload -f weight_payload -k mysecret -u $USERID -w 300
# Sign weight_payload
fero-client -a $BASTION_ADDRESS weight -k mysecret -u $USERID -w 300 \
    -s weight_payload.sig.1 -s weight_payload.sig.2 -s weight_payload.sig.3

More Repositories

1

fleet

fleet ties together systemd and etcd into a distributed init system
Go
2,426
star
2

go-systemd

Go bindings to systemd socket activation, journal, D-Bus, and unit files
Go
2,232
star
3

torus

Torus Distributed Storage
Go
1,776
star
4

etcd-operator

etcd operator creates/configures/manages etcd clusters atop Kubernetes
Go
1,740
star
5

coreos-vagrant

Minimal Vagrantfile for Container Linux
1,654
star
6

go-oidc

A Go OpenID Connect client.
Go
1,633
star
7

coreos-kubernetes

CoreOS Container Linux+Kubernetes documentation & Vagrant installers
Shell
1,105
star
8

go-iptables

Go wrapper around iptables utility
Go
1,046
star
9

rpm-ostree

โš›๐Ÿ“ฆ Hybrid image/package system with atomic upgrades and package layering
C
820
star
10

vault-operator

Run and manage Vault on Kubernetes simply and securely
Go
759
star
11

ignition

First boot installer and configuration tool
Go
747
star
12

tectonic-installer

Install a Kubernetes cluster the CoreOS Tectonic Way: HA, self-hosted, RBAC, etcd Operator, and more
HCL
597
star
13

toolbox

bring your tools with you
Shell
395
star
14

go-etcd

DEPRECATED - please use the official client at https://github.com/coreos/etcd/tree/master/client
Go
365
star
15

coreos-cloudinit

[DEPRECATED] - Simple configuration tool for Container Linux
Go
344
star
16

grub

GRand Unified Bootloader http://www.gnu.org/software/grub/grub.html
C
333
star
17

coreos-xhyve

Container Linux running on xhyve hypervisor
Shell
332
star
18

coreos-assembler

Tooling container to assemble CoreOS-like systems
Go
322
star
19

go-semver

semver library in Go
Go
317
star
20

locksmith

Reboot manager for Container Linux
Go
273
star
21

fedora-coreos-tracker

Issue tracker for Fedora CoreOS
262
star
22

coreos-overlay

Custom ebuilds for Container Linux
Shell
249
star
23

container-linux-update-operator

A Kubernetes operator to manage updates of Container Linux by CoreOS
Go
211
star
24

coreos-installer

Installer for CoreOS disk images
Rust
209
star
25

etcd-ca

Go
199
star
26

awesome-kubernetes-extensions

A resource tracking a number of Kubernetes extensions built on TPRs, CRDs, and API Aggregation
199
star
27

butane

Butane translates human-readable Butane Configs into machine-readable Ignition Configs.
Go
199
star
28

container-linux-config-transpiler

Convert a Container Linux Config into Ignition
Go
190
star
29

pkg

a collection of go utility packages
Go
186
star
30

afterburn

A one-shot cloud provider agent
Rust
183
star
31

etcdctl

DEPRECATED - see https://github.com/coreos/etcd/tree/master/etcdctl instead
181
star
32

discovery.etcd.io

etcd discovery service
Go
168
star
33

scripts

Build and maintenance scripts for Container Linux
Shell
155
star
34

bugs

Issue tracker for CoreOS Container Linux
148
star
35

zincati

Agent for Fedora CoreOS auto-updates
Rust
139
star
36

fedora-coreos-config

Base configuration for Fedora CoreOS
Shell
135
star
37

kpm

KPM is a tool to deploy and manage application stacks on Kubernetes.
Python
124
star
38

issue-sync

A tool for synchronizing issue tracking between GitHub and JIRA
Go
123
star
39

terraform-aws-kubernetes

Install a Kubernetes cluster the CoreOS Tectonic Way: HA, self-hosted, RBAC, etcd Operator, and more
HCL
117
star
40

manifest

repo tool manifest for Container Linux sdk
99
star
41

go-omaha

omaha protocol for go
Go
96
star
42

init

init system units and configuration for Container Linux
Shell
95
star
43

mantle

Mantle: Gluing Container Linux together
Go
93
star
44

quartermaster

A framework for managing containerized storage systems on top of Kubernetes
Go
93
star
45

bootupd

Bootloader updater
Rust
86
star
46

aws-auth-proxy

HTTP proxy that signs requests for upstream AWS endpoints
Go
86
star
47

mayday

A diagnostics tool for capturing system state.
Go
80
star
48

go-webrtc-datachannel

Go
77
star
49

go-gitreceive

A gitreceive implementation in Go
Go
75
star
50

torcx

torcx is a boot-time addon manager for immutable systems
Go
73
star
51

elb-presence

Python
72
star
52

layering-examples

Dockerfile
72
star
53

unit-examples

A collection of systemd units designed to run on CoreOS/fleet
65
star
54

go-workflow

Go
60
star
55

corelb

a loadbalancer built on coreinit and nginx
Lua
55
star
56

go-tcmu

Go SCSI emulation via the Linux TCM in Userspace module
Go
54
star
57

go-namespaces

DEPRECATED: Golang implementations of Linux Namespaces
Go
52
star
58

third_party.go

third_party.go - self contained GOPATH helper
Go
49
star
59

fedora-coreos-pipeline

Build pipeline for Fedora CoreOS
Groovy
49
star
60

fedora-coreos-docs

Documentation for Fedora CoreOS
Shell
48
star
61

updateservicectl

CoreUpdate Command Line Interface
Go
48
star
62

coreos-web

CSS
45
star
63

depot_tools

Python
43
star
64

jenkins-os

Groovy pipeline jobs that build and test Container Linux with Jenkins
Groovy
43
star
65

fabric-kubernetes-nodes

A fabric Fabfile for SSHing into Kubernetes nodes by label query
43
star
66

gocat

Socket activated transparent SSL proxy written in Go
Go
42
star
67

ssh-key-dir

sshd AuthorizedKeysCommand to read ~/.ssh/authorized_keys.d
Rust
42
star
68

tectonic-docs

Tectonic documentation - https://coreos.com/tectonic/docs/latest/
42
star
69

flannel-cni

Image for sidecar container that installs cni related assets for flannel
Shell
41
star
70

grafiti

Tag and remove AWS Resources with Automation
Go
39
star
71

go-log

Go logging library with systemd journal support
Go
38
star
72

update-ssh-keys

Deprecated tool for managing authorized ssh keys
Rust
38
star
73

airlock

Minimal update/reboot orchestrator for Fedora CoreOS clusters
Go
38
star
74

nsproxy

Linux namespaces tcp proxy
Go
36
star
75

ksched

Experimental flow-based Kubernetes scheduler
Go
36
star
76

update_engine

update daemon for Container Linux
C++
35
star
77

openssh-keys

A pure-Rust library to read and write OpenSSH public keys
Rust
35
star
78

fedora-coreos-streams

Stream metadata and overrides for Fedora CoreOS
Python
34
star
79

bootengine

Initramfs for Container Linux
Shell
31
star
80

cargo-vendor-filterer

Tool to `cargo vendor` with filtering
Rust
30
star
81

krud

kubernetes rolling update webhook server
Go
30
star
82

tectonic-forum

29
star
83

gzran

gzip indexer for random access into compressed files
Go
28
star
84

bcrypt-tool

Go
27
star
85

portage-stable

unmodified ebuilds mirrored from the portage tree
Shell
27
star
86

minikube-iso

An alternative bootable ISO image for minikube
27
star
87

khealth

basic kubernetes health monitoring
Go
26
star
88

kscale

Scripts for k8s scalability testing and analysis
Go
24
star
89

terraform-azurerm-kubernetes

Install a Kubernetes cluster the CoreOS Tectonic Way: HA, self-hosted, RBAC, etcd Operator, and more
HCL
22
star
90

coreos.fedoraproject.org

Old coreos.fedoraproject.org website (deprecated)
HTML
21
star
91

awscli

AWS CLI container image
21
star
92

baselayout

Basic Container Linux filesystem layout and configs
Shell
20
star
93

subgun

Subscribe to a mailing list on mailgun via a web interface
Go
20
star
94

license-bill-of-materials

Fork of https://github.com/pmezard/licenses
Go
19
star
95

etcd-manager

An etcd cluster management tool
Go
19
star
96

systemd-rest

Go
19
star
97

kapprover

A kubelet CSR auto-approver
Go
18
star
98

docker-nginx-https-redirect

Docker container which redirects any http request on 80 to https on 443
17
star
99

enhancements

Enhancement tracking repo for CoreOS-based systems
17
star
100

envsubst-rs

Simple Rust library for variables substitution
Rust
17
star