Small additions to ssh article
- Section about forced commands - Loads of small edits
This commit is contained in:
parent
ecd0f85ef3
commit
33f424cd71
|
@ -3,7 +3,7 @@ title: "SSH Configuration"
|
||||||
date: "2022-09-27T11:40:31+02:00"
|
date: "2022-09-27T11:40:31+02:00"
|
||||||
author: "$HUMANOID"
|
author: "$HUMANOID"
|
||||||
tags: ["ssh", "technology"]
|
tags: ["ssh", "technology"]
|
||||||
description: "An article on configuring SSH from the ground up to something that can grow out into my monster of a configuration"
|
description: "An article on configuring SSH from the ground up to something that can grow out into something like my monster of a config file"
|
||||||
toc: true
|
toc: true
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -25,22 +25,22 @@ I typically generate mine using:
|
||||||
ssh-keygen -t ed25519 -f ~/.ssh/<new-key>
|
ssh-keygen -t ed25519 -f ~/.ssh/<new-key>
|
||||||
```
|
```
|
||||||
Without any parameters, it will generate an rsa3072 key.
|
Without any parameters, it will generate an rsa3072 key.
|
||||||
This form of cryptography isn't the recommended as it's become a bit flimsy with computers becoming stronger.
|
This form of cryptography isn't recommended as it's become a bit flimsy with computers becoming stronger.
|
||||||
Instead I recommend at least adding the `-t ed25519` flag to generate a ed25519 key instead.
|
Instead I recommend at least adding the `-t ed25519` flag to generate a ed25519 key.
|
||||||
|
|
||||||
When prompted for a passphrase, **_always_** give it one.
|
When prompted for a passphrase, **_always_** give it one.
|
||||||
The only reason where _not_ using a passphrase is acceptable is when you are planning on using the key for a [forced command]().
|
The only situation where _not_ using a passphrase is acceptable is when you are planning on using the key for a [forced command](#forced-commands).
|
||||||
|
|
||||||
# Server Configuration
|
# Server Configuration
|
||||||
|
|
||||||
This is all done under the assumption that the you use OpenSSH implementation on your server.
|
This is all done under the assumption that the you use the OpenSSH implementation on your server.
|
||||||
If you use something like Dropbear, I can't help you as haven't properly dug through it's configuration file (yet).
|
If you use something like Dropbear, I can't help you as haven't properly dug through it's configuration file (yet).
|
||||||
|
|
||||||
The thing I see way to often on the internet is
|
The thing I see way to often on the internet is
|
||||||
|
|
||||||
* People not disabling password authentication.
|
* People not disabling password authentication.
|
||||||
* Changing the default port or only allowing.
|
* People not changing the default port <!--or only allowing a range of IPs to log in-->.
|
||||||
* Don't disable root login and never use it.
|
* People not disabling root login and never using it.
|
||||||
|
|
||||||
So lets go through these steps one by one.
|
So lets go through these steps one by one.
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ A solution next to this is to use `fail2ban` along side changing the port.
|
||||||
|
|
||||||
> "Won't this mean I have to add the port to my login command every time I go to this server?"
|
> "Won't this mean I have to add the port to my login command every time I go to this server?"
|
||||||
|
|
||||||
No, more in this in [the client configuration] section
|
No, more in this in [the client configuration](#client-configuration) section
|
||||||
|
|
||||||
In `/etc/ssh/sshd_config` look for
|
In `/etc/ssh/sshd_config` look for
|
||||||
```sshd_config
|
```sshd_config
|
||||||
|
@ -123,7 +123,7 @@ In `/etc/ssh/sshd_config` look for
|
||||||
and change the `Port` to your liking, I tend to change this to something like 6969 or some other meme number.
|
and change the `Port` to your liking, I tend to change this to something like 6969 or some other meme number.
|
||||||
|
|
||||||
Another thing I tend to do is not open a port in my firewall, thus preventing any normal outside connections all together.
|
Another thing I tend to do is not open a port in my firewall, thus preventing any normal outside connections all together.
|
||||||
Instead opting to only connecting over Yggdrasil and/or Tor.
|
Instead opting to only connect over Yggdrasil and/or Tor.
|
||||||
|
|
||||||
# Client configuration
|
# Client configuration
|
||||||
|
|
||||||
|
@ -136,20 +136,22 @@ The very first thing I do after setting up a server, is add an entry to my `~/.s
|
||||||
A basic configuration section looks like the following:
|
A basic configuration section looks like the following:
|
||||||
```ssh_config
|
```ssh_config
|
||||||
Host <host> # this is something you can easily identify
|
Host <host> # this is something you can easily identify
|
||||||
Host <host-name> # this does need to be an IP address or DNS record pointing to an IP address
|
Host <hostname> # this does need to be an IP address or DNS record pointing to an IP address
|
||||||
IdentityFile ~/.ssh/<key-file>
|
IdentityFile ~/.ssh/<key-file>
|
||||||
User <user-name>
|
User <user-name>
|
||||||
Port <meme-number>
|
Port <meme-number>
|
||||||
```
|
```
|
||||||
This allows you to log into host `<host>` with on port `<meme-number>` with key `~/.ssh/<key-file>` as user `<user-name>` without by typing:
|
This allows you to log into host `<host>` with on port `<meme-number>` with key `~/.ssh/<key-file>` as user `<user-name>` without by typing:
|
||||||
```sh
|
```sh
|
||||||
ssh <user-name>@<host-name> -p <meme-number> -i ~/.ssh/<key-file>
|
ssh <user-name>@<hostname> -p <meme-number> -i ~/.ssh/<key-file>
|
||||||
```
|
```
|
||||||
Instead the following command will work:
|
Instead the following command will work:
|
||||||
```sh
|
```sh
|
||||||
ssh <host>
|
ssh <host>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
More information on the SSH config file can be found in the `ssh_config` manpage.
|
||||||
|
|
||||||
Some other frequently used settings for me are:
|
Some other frequently used settings for me are:
|
||||||
* `AddKeysToAgent`
|
* `AddKeysToAgent`
|
||||||
* `IdentitiesOnly`
|
* `IdentitiesOnly`
|
||||||
|
@ -165,7 +167,7 @@ This is useful if you frequently log in and out of a certain host and don't want
|
||||||
|
|
||||||
Ignore whatever keys your agent has and only use the contents of `IdentityFile`.
|
Ignore whatever keys your agent has and only use the contents of `IdentityFile`.
|
||||||
|
|
||||||
Useful for when you want to be able to log into the same host using multiple keys.
|
Useful for when you want to be able to log into the same host using multiple keys while using an SSH agent session.
|
||||||
|
|
||||||
### `ProxyCommand`
|
### `ProxyCommand`
|
||||||
|
|
||||||
|
@ -178,7 +180,7 @@ I use this for my Tor hosts:
|
||||||
```ssh_config
|
```ssh_config
|
||||||
Host tor-<host>
|
Host tor-<host>
|
||||||
Hostname <lengthy-56-character-string>.onion
|
Hostname <lengthy-56-character-string>.onion
|
||||||
# this is dependent on the netcat implementation of the OpenBSD project
|
# this is dependent on the netcat implementation of the OpenBSD project, often packaged as "netcat-openbsd"
|
||||||
ProxyCommand nc -X 5 -x localhost:9050 %h %p # this assumes you are running a tor proxy on your local system and attempts to make a connection through that
|
ProxyCommand nc -X 5 -x localhost:9050 %h %p # this assumes you are running a tor proxy on your local system and attempts to make a connection through that
|
||||||
Identityfile ~/.ssh/<key-file>
|
Identityfile ~/.ssh/<key-file>
|
||||||
User <user>
|
User <user>
|
||||||
|
@ -227,3 +229,38 @@ eval $(keychain --agents 'gpg,ssh' --eval)
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
As you can see, it can also keep track of your GPG agent.
|
As you can see, it can also keep track of your GPG agent.
|
||||||
|
|
||||||
|
# Forced Commands
|
||||||
|
|
||||||
|
Another amazing feature of SSH is forced commands.
|
||||||
|
The name is relatively self explanatory.
|
||||||
|
You give a public key the privilege to execute a single command and nothing else.
|
||||||
|
This is really useful if there is something that you frequently do on a server which is simple enough that it can be automated but still requires interaction from device.
|
||||||
|
|
||||||
|
I make use of a forced command to open NCMPCPP on my MPD server.
|
||||||
|
Logging in every time and typing `ncmpcpp` every time I wanted to add or remove some songs from the current playlist got annoying really fast.
|
||||||
|
|
||||||
|
On my client machines I have an entry in my `~/.ssh/config` with roughly the following:
|
||||||
|
```ssh_config
|
||||||
|
Host <host>-radio
|
||||||
|
Hostname <hostname>
|
||||||
|
User <mpd-user>
|
||||||
|
Port <meme-number>
|
||||||
|
Identityfile ~/.ssh/<host>-radio
|
||||||
|
IdentitiesOnly yes # here's where forcing it to ignore the ssh agent comes in useful
|
||||||
|
```
|
||||||
|
On my MPD server, I have the following in `~/.ssh/authorized_keys`:
|
||||||
|
```authorized_keys
|
||||||
|
command="ncmpcpp" ssh-ed25519 <contents of <host>-radio.pub>
|
||||||
|
```
|
||||||
|
|
||||||
|
When I `ssh` to `<host>-radio`, all I get is an NCMPCPP session.
|
||||||
|
|
||||||
|
On one of my Raspberry Pis, I make use of a forced command to toggle my desk lamp using a little wrapper I wrote around the Pi's GPIO interface.
|
||||||
|
It has the following line in `~/.ssh/authorized_keys`:
|
||||||
|
```authorized_keys
|
||||||
|
no-pty,command="/path/to/script/lamp toggle" ssh-ed25519 <contents of lamp-key.pub>
|
||||||
|
```
|
||||||
|
The `no-pty` option prevents any sessions opened with this key from starting an interactive shell session.
|
||||||
|
|
||||||
|
Documentation of the `authorized_keys` file can be found in the `sshd` manpage under the `AUTHORIZED_KEYS FILE FORMAT` section.
|
||||||
|
|
Loading…
Reference in a new issue