This guide will configure a simple secured linux server. In this example, I will configure a raspberry pi.
This section is for preparing an SD card with Raspbian from a Mac. Start by opening a terminal. Start by downloading the latest version of raspbian:
curl -O -J -L https://downloads.raspberrypi.org/raspbian_lite_latestThis might take a while since the file a fairly large. When the dowload is complete, unzip the zip-file:
unzip *-raspbian*-lite.zipWhen that has finished, there should be a file named [date]-raspbian-[release_name]-lite.zip. At this point in time, the latest release for me is called 2018-04-18-raspbian-stretch-lite.zip.
Now plug in your SD card. Find out the right diskt using diskutil:
diskutil listI can usually recognize the correct device by looking at the size, however since the next few steps are extremely dangerous, it is recommended if you are even the slightest in doubt to plug out the SD card, run the command, then plug in back in and run the command again. Then compare the output to make sure it is indeed the correct device.
For me the device is /dev/disk3. Now, unmount the device:
diskutil unmountDisk /dev/disk3Now the dangerous part comes. We will be using DiskDestroyer (dd) to copy the image file to the SD card, again make sure you are using the correct device. If your device is /dev/disk3 like mine, you need to use /dev/rdisk3 for this next command (notice the r in font of disk):
sudo dd bs=1m if=2018-04-18-raspbian-stretch-lite.img of=/dev/rdisk3 conv=sync status=progressif is the input file while of if the output file. So it is important to make sure these are correct. dd command will not backup anything, so if you fucked up somewhere, you are screwed. Double check everything!
When that command has finished, make sure the SD card is still mounted. Then to enable SSH (pretty much needed for a headless server), make a file called ssh:
touch /Volumes/boot/sshTo make the raspberry pi automatically connect to a wifi access point:
vim /Volumes/boot/wpa_supplicant.confAnd add this to it:
country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="[SSID]"
psk="[password]"
}
Now eject the SD card
diskutil eject /dev/disk3plug it into the Raspberry Pi and turn it on.
One easy way to connect to it is by powering it using USB from the computer, however it is possible to find it fairly easy on the network as well. If you connect it to the computer, connect to it using dns:
Or if you need to find it first, use nmap (brew install nmap if you don't have it):
nmap 10.20.0.0/24 -PS22Replace the ip-range to how your network is configured. The raspberry pi should pop up there if everything worked out. Now proceed to the next steps in this guide.
To find the server, let's scan the network for devices:
nmap 10.20.0.0/24 -PS22I use -PS22 to only see hosts with port 22 (SSH) open, which the raspberry pi has.
In my case, 10.20.0.103 is my raspberry pi:
Nmap scan report for 10.20.0.103
Host is up (0.00091s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
22/tcp open ssh
If you are using my dotfiles (https://github.com/algorythm/dotfiles), simply run n22 to get a list of IPs where port 22 is open.
Now SSH into the device. Default username and password for Raspberry Pi's are:
Username: pi, Password: raspberry
Make sure the device is up to date with updates:
sudo apt-get updateBefore upgrading the system, I usually like to install vim and tmux. Tmux mostly so I can update in a window
sudo apt-get install -y vim tmux git
sudo update-alternatives --config editor # Update default text editor to vim
# or to be explicit:
sudo update-alternatives --set editor /usr/bin/vim.basicThen update the system:
tmux new -s update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade -y
# ctrl - b -> d to deattach from tmux window
tmux a -t update # attach to tmux window againThe raspberry pi has a bit slow CPU, so in this case it might take a while.
If you get the following error after trying to start tmux:
tmux: invalid LC_ALL, LC_CTYPE or LANG
You probably have an issue with the configured locale. One solution may be to install and reconfigure the locale used. By default, only en_US_UTF8 is installed. For me, raspbian were configured to use en_GB_UTF8. You might be missing the used locale. Start by installing locales if it is not installed already
sudo apt-get install localeThe locale command can be used to display information about the current locale
localeTo configure a new locale
sudo dpkg-reconfigureSelect the chosen locale, mark it by pressing space, then continue by pressing enter.
NOTE: This is only needed for Raspberry Pis!
sudo raspi-configDo following:
- Change the Pi password
- Disable "Boot to Desktop" - it's simply not needed for most cases
- Update locale settings
- Set the hostname (Network > Hostname)
- Set the Memory Split (Advanced > Momery Split) - set it to 16 since the desktop is not going to be used
- Ensure SSH is enabled (Advanced > SSH) - if you completed the step above, then SSH is enabled
- Commit the changes and reboot
sudo rebootSee a list of groups:
groupsIn my case, I get the following output:
pi adm dialout cdrom sudo audio video plugdev games users netdev input
Issue following command to add a user with correct permissions (at least for Raspberry Pis):
Best way to add a user is to issue the following command:
- sudo useradd -m -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input USERNAME
+ sudo adduser USERNAME
+ sudo adduser USERNAME sudo # to add the user to the group sudoReplace USERNAME with your desired username. Then, if the user needs sudo:
sudo visudoFind a line that says root ALL=(ALL:ALL) ALL and add a new line with your newly added user:
root ALL=(ALL:ALL) ALL
- awo ALL=(ALL:ALL) ALLTo change a password:
sudo passwd USERNAME
exitNow sign in again, though this time as your new user. Then, deletedisable the pi user:
- sudo deluser --remove-all-files pi
+ sudo passwd pi -l
# Unlock "pi" user: sudo passwd pi -uSSH keys are generally a lot more secure than logging in with SSH. To generate a new SSH key:
ssh-keygen -t rsa -b 4096 -C "USERNAME@HOSTNAME"I usually stick with the default save location of ~/.ssh/id_rsa. To be more secure, make sure to password protect the SSH key.
Then, disable root login as well as login with password using SSH. Edit /etc/ssh/sshd_config, make sure that the following settings are set:
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords yes
PubkeyAuthentication yessudo fdisk -l
# Look for the USB drive (i.e. /dev/sda1
sudo mkdir /my-folder
sudo mount /dev/sda1 /my-folder
sudo chgrp -R users /my-folder
sudo chmod -R g+w /my-folder
sudo vim /etc/fstabPress o to start a new line and write:
/dev/sda1 [tab] /my-folder [tab] ext4 [tab] defaults [tab] 0 [tab] 2
Press [ESCAPE] :wq [ENTER] to save and exit.
The group called "users" now has read and write access to the usb drive located at /dev/sda1, mounted at /my-folder.
NOTE: For testing purposes, sudo mount -a mounts everything in the fstab file.