Last active
August 15, 2023 06:56
-
-
Save anpin/098b888ce266023d3a7a20e203567260 to your computer and use it in GitHub Desktop.
drduh/YubiKey-Guide adapted for flakes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# yubikey-installer.nix | |
{ config, lib, pkgs, modulesPath, ... }: | |
with pkgs; | |
let | |
# src = fetchGit "https://github.com/drduh/YubiKey-Guide"; | |
src = fetchFromGitHub { | |
owner = "drduh"; | |
repo = "YubiKey-Guide"; | |
rev = "master"; | |
sha256 = "sha256-N76e/yhXUoWUK6EQZHGyTs0DcbZqAlI5xtQMf0squR8="; | |
}; | |
guide = "${src}/README.md"; | |
contrib = "${src}/contrib"; | |
drduhConfig = fetchGit "https://github.com/drduh/config"; | |
gpg-conf = ./gpg.conf; | |
xserverCfg = config.services.xserver; | |
pinentryFlavour = if xserverCfg.desktopManager.lxqt.enable || xserverCfg.desktopManager.plasma5.enable then | |
"qt" | |
else if xserverCfg.desktopManager.xfce.enable then | |
"gtk2" | |
else if xserverCfg.enable || config.programs.sway.enable then | |
"gnome3" | |
else | |
"curses"; | |
# Instead of hard-coding the pinentry program, chose the appropriate one | |
# based on the environment of the image the user has chosen to build. | |
gpg-agent-conf = runCommand "gpg-agent.conf" {} '' | |
sed '/pinentry-program/d' ${./gpg-agent.conf} > $out | |
echo "pinentry-program ${pinentry.${pinentryFlavour}}/bin/pinentry" >> $out | |
''; | |
view-yubikey-guide = writeShellScriptBin "view-yubikey-guide" '' | |
viewer="$(type -P xdg-open || true)" | |
if [ -z "$viewer" ]; then | |
viewer="${glow}/bin/glow -p" | |
fi | |
exec $viewer "${guide}" | |
''; | |
shortcut = makeDesktopItem { | |
name = "yubikey-guide"; | |
icon = "${yubikey-manager-qt}/share/ykman-gui/icons/ykman.png"; | |
desktopName = "drduh's YubiKey Guide"; | |
genericName = "Guide to using YubiKey for GPG and SSH"; | |
comment = "Open the guide in a reader program"; | |
categories = [ "Documentation" ]; | |
exec = "${view-yubikey-guide}/bin/view-yubikey-guide"; | |
}; | |
yubikey-guide = symlinkJoin { | |
name = "yubikey-guide"; | |
paths = [ view-yubikey-guide shortcut ]; | |
}; | |
in { | |
# imports = [ | |
# (modulesPath + "/installer/cd-dvd/installation-cd-graphical-gnome.nix") | |
# ]; | |
nixpkgs.config = { allowBroken = true; }; | |
services.xserver = { | |
layout = "us"; | |
xkbVariant = ""; | |
enable = true; | |
displayManager.gdm.enable = true; | |
desktopManager.gnome.enable = true; | |
}; | |
isoImage = with lib; { | |
isoBaseName = mkForce "nixos-yubikey"; | |
systemd-boot.enable = mkForce true; | |
}; | |
# Uncomment this to disable compression and speed up image creation time | |
#isoImage.squashfsCompression = "gzip -Xcompression-level 1"; | |
boot = with lib; { | |
kernelPackages = pkgs.linuxPackages_latest; | |
initrd.network.enable = false; | |
loader.efi.canTouchEfiVariables = true; | |
kernelParams = [ "copytoram" ]; | |
tmp.cleanOnBoot = true; | |
kernel.sysctl = { "kernel.unprivileged_bpf_disabled" = 1; }; | |
}; | |
services.pcscd.enable = true; | |
services.udev.packages = [ yubikey-personalization ]; | |
programs = { | |
ssh.startAgent = false; | |
gnupg.agent = { | |
enable = true; | |
enableSSHSupport = true; | |
}; | |
}; | |
environment.systemPackages = [ | |
# Tools for backing up keys | |
paperkey | |
pgpdump | |
parted | |
cryptsetup | |
# Yubico's official tools | |
yubikey-manager | |
yubikey-manager-qt | |
yubikey-personalization | |
yubikey-personalization-gui | |
yubico-piv-tool | |
yubioath-flutter | |
# Testing | |
ent | |
# (haskell.lib.justStaticExecutables haskellPackages.hopenpgp-tools) | |
# Password generation tools | |
diceware | |
pwgen | |
# Miscellaneous tools that might be useful beyond the scope of the guide | |
cfssl | |
pcsctools | |
# This guide itself (run `view-yubikey-guide` on the terminal to open it | |
# in a non-graphical environment). | |
yubikey-guide | |
neovim | |
]; | |
nix = { | |
# enable flakes | |
# package = pkgs.nixFlakes; | |
extraOptions = ''experimental-features = nix-command flakes''; | |
# optimize store cache | |
settings.auto-optimise-store = true; | |
}; | |
# Disable networking so the system is air-gapped | |
# Comment all of these lines out if you'll need internet access | |
networking.dhcpcd.enable = false; | |
networking.dhcpcd.allowInterfaces = []; | |
networking.interfaces = {}; | |
networking.firewall.enable = true; | |
networking.useDHCP = false; | |
networking.useNetworkd = false; | |
networking.wireless.enable = false; | |
networking.networkmanager.enable = lib.mkForce false; | |
# Unset history so it's never stored | |
# Set GNUPGHOME to an ephemeral location and configure GPG with the | |
# guide's recommended settings. | |
environment.interactiveShellInit = '' | |
unset HISTFILE | |
export GNUPGHOME="/run/user/$(id -u)/gnupg" | |
if [ ! -d "$GNUPGHOME" ]; then | |
echo "Creating \$GNUPGHOME…" | |
install --verbose -m=0700 --directory="$GNUPGHOME" | |
fi | |
[ ! -f "$GNUPGHOME/gpg.conf" ] && cp --verbose ${gpg-conf} "$GNUPGHOME/gpg.conf" | |
[ ! -f "$GNUPGHOME/gpg-agent.conf" ] && cp --verbose ${gpg-agent-conf} "$GNUPGHOME/gpg-agent.conf" | |
echo "\$GNUPGHOME is \"$GNUPGHOME\"" | |
''; | |
# Copy the contents of contrib to the home directory, add a shortcut to | |
# the guide on the desktop, and link to the whole repo in the documents | |
# folder. | |
system.activationScripts.yubikeyGuide = let | |
homeDir = "/home/nixos/"; | |
desktopDir = homeDir + "Desktop/"; | |
documentsDir = homeDir + "Documents/"; | |
in '' | |
mkdir -p ${desktopDir} ${documentsDir} | |
chown nixos ${homeDir} ${desktopDir} ${documentsDir} | |
cp -R ${contrib}/* ${homeDir} | |
ln -sf ${yubikey-guide}/share/applications/yubikey-guide.desktop ${desktopDir} | |
ln -sfT ${src} ${documentsDir}/YubiKey-Guide | |
''; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
nixosConfigurations.yubikey = nixpkgs.lib.nixosSystem { | |
inherit system; | |
modules = [ | |
nixos-generators.nixosModules.iso | |
./yubikey-installer { inherit (nixpkgs) lib; } | |
]; | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://github.com/drduh/config/blob/master/gpg-agent.conf | |
# https://www.gnupg.org/documentation/manuals/gnupg/Agent-Options.html | |
enable-ssh-support | |
ttyname $GPG_TTY | |
default-cache-ttl 60 | |
max-cache-ttl 120 | |
pinentry-program /usr/bin/pinentry-curses | |
#pinentry-program /usr/bin/pinentry-tty | |
#pinentry-program /usr/bin/pinentry-gtk-2 | |
#pinentry-program /usr/bin/pinentry-x11 | |
#pinentry-program /usr/bin/pinentry-qt | |
#pinentry-program /usr/local/bin/pinentry-curses | |
#pinentry-program /usr/local/bin/pinentry-mac | |
#pinentry-program /opt/homebrew/bin/pinentry-mac |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://github.com/drduh/config/blob/master/gpg.conf | |
# https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html | |
# https://www.gnupg.org/documentation/manuals/gnupg/GPG-Esoteric-Options.html | |
# Use AES256, 192, or 128 as cipher | |
personal-cipher-preferences AES256 AES192 AES | |
# Use SHA512, 384, or 256 as digest | |
personal-digest-preferences SHA512 SHA384 SHA256 | |
# Use ZLIB, BZIP2, ZIP, or no compression | |
personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed | |
# Default preferences for new keys | |
default-preference-list SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed | |
# SHA512 as digest to sign keys | |
cert-digest-algo SHA512 | |
# SHA512 as digest for symmetric ops | |
s2k-digest-algo SHA512 | |
# AES256 as cipher for symmetric ops | |
s2k-cipher-algo AES256 | |
# UTF-8 support for compatibility | |
charset utf-8 | |
# Show Unix timestamps | |
fixed-list-mode | |
# No comments in signature | |
no-comments | |
# No version in output | |
no-emit-version | |
# Disable banner | |
no-greeting | |
# Long hexidecimal key format | |
keyid-format 0xlong | |
# Display UID validity | |
list-options show-uid-validity | |
verify-options show-uid-validity | |
# Display all keys and their fingerprints | |
with-fingerprint | |
# Display key origins and updates | |
#with-key-origin | |
# Cross-certify subkeys are present and valid | |
require-cross-certification | |
# Disable caching of passphrase for symmetrical ops | |
no-symkey-cache | |
# Enable smartcard | |
use-agent | |
# Disable recipient key ID in messages | |
throw-keyids | |
# Default/trusted key ID to use (helpful with throw-keyids) | |
#default-key 0xFF3E7D88647EBCDB | |
#trusted-key 0xFF3E7D88647EBCDB | |
# Group recipient keys (preferred ID last) | |
#group keygroup = 0xFF00000000000001 0xFF00000000000002 0xFF3E7D88647EBCDB | |
# Keyserver URL | |
#keyserver hkps://keys.openpgp.org | |
#keyserver hkps://keyserver.ubuntu.com:443 | |
#keyserver hkps://hkps.pool.sks-keyservers.net | |
#keyserver hkps://pgp.ocf.berkeley.edu | |
# Proxy to use for keyservers | |
#keyserver-options http-proxy=http://127.0.0.1:8118 | |
#keyserver-options http-proxy=socks5-hostname://127.0.0.1:9050 | |
# Verbose output | |
#verbose | |
# Show expired subkeys | |
#list-options show-unusable-subkeys |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment