Here are some bits and pieces on SELINUX:
How to view the current SELinux status?
$sestatus
Where is main configuration file?
/etc/selinux/config
How to set booleans?
$setsebool -P httpd_read_user_content 1
or,
$semanage boolean -m --on httpd_read_user_content
How to list booleans?
$getsebool httpd_read_user_content
or,
$semanage boolean -l |grep httpd_read_user_content
How to allow the Apache HTTP server to provide service on port 9876?
$semanage port -a -t http_port_t -p tcp 9876
How to allow the Apache HTTP server to connect to your database server?
$semanage boolean -m --on httpd_can_network_connect_db
How to allow the Apache HTTP server to send mail?
$semanage boolean -m --on httpd_can_sendmail
How to execute multiple commands within a single transaction?
$semanage -i command-file
How to change the security context (temporarily) on a file/directory?
$chcon -t my_type_t /path/to/file # on single file
$chcon -R -t my_type_t /path/to/directory # recursively on directory
How to change the security context (persistently) on a file/directory?
$semanage fcontext -a -t my_type_t /path/to/file
# this will add the specified rule to the local context file, then label it
$restorecon -v /path/to/myfile
How to check/correct the security context on filesystems?
$fixfiles -v check /path/to/file_or_directory # check only
$fixfiles -v restore /path/to/file_or_directory # restore/correct
How to restore default security contexts of a directory tree?
$restorecon -Rv /path/to/the/directory
How to relabel complete filesystem?
$touch /.autorelabel # using init
$reboot
or,
$fixfiles restore # using fixfiles
How to preserve file security contextx when copying?
$cp --preserve=context /path/to/src /path/to/dst
How to change file security contextx when copying?
$install --context=new_context /path/to/src /path/to/dst
How to create archives that retain security contexts?
$tar --selinux -cvzf archive.tgz /path/to/directory # create archive
$tar --selinux -xvzf archive.tgz # extract files from archive
# star should be used, if option selinux is not supported in tar
How to mount a device with a specific security context?
$mount -o context=SELinux_user:role:type:level device dir
How to start SELINUX troubleshooting tool?
$sealert -b
Where is log file?
/var/log/audit/audit.log #audit on
or,
/var/log/messages #audit off
How to add new rules regarding xxxx to policy?
$grep xxxx /var/log/audit/audit.log | audit2allow -M xxxxlocal
$semodule -i xxxxlocal.pp
Hot to start the SELinux management GUI tool?
$system-config-selinux
# we need to install package policycoreutils-gui first
A journal on information technology: things I studied, worked, thought, but can't stay in my memory.
Showing posts with label linux. Show all posts
Showing posts with label linux. Show all posts
Saturday, September 21, 2013
Saturday, September 14, 2013
SELINUX -- Concepts
Security-Enhanced Linux (SELinux) is an implementation of a mandatory access control (MAC) mechanism in the Linux kernel, which further enforces MAC after traditional discretionary access controls (DAC) are checked.
Processes and files are labeled with an SELinux context, which includes an SELinux user, role, type, and level. Within SELinux, all of this information are used to form the access control decisions. For performance reason, SELinux decisions are cached, and the cache is named the Access Vector Cache (AVC). In Fedora, SELinux provides a combination of Role-Based Access Control (RBAC), Type Enforcement (TE), and Multi-Level Security (MLS).
The command sestatus allows us to get the status of a system running SELinux. Here is an example output of command sestatus:
$setstatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
The output shows that the SELinux is enabled and is currently running in the enforcing mode the same as current configuration. It also tells us that the configuration root directory is /etc/selinux and a targeted policy is used for MAC. The status could be enabled, disabled, or permissive, where permissive means that SELinux should print warnings instead of enforcing. The command setenforce allows us to modify the running mode of SELinux. Changes should be made in the configuration file /etc/selinux/config if we want it be persistent.
All processes and files are labeled with a type (part of SELinux context). The option -Z allows us to find the type (security context) of a file/process. For examples:
$ls -Z /etc/shadow
----------. root root system_u:object_r:shadow_t:s0 /etc/shadow
It shows that the security context (user, role, type, level) of the file /etc/shadow is system_u:object_r:shadow_t:s0.
$ps -eZ|grep passwd
unconfined_u:unconfined_r:passwd_t:s0-s0:c0.c1023 2630 pts/0 00:00:00 passwd
It tells that the security context of the process passwd run by a regular user is unconfined_u:unconfined_r:passwd_t:s0-s0:c0.c1023.
The type of a process defines its domain. Processes are separated from each other by running in their own domains. The SELinux policy defines rules that determine how processes interact with files, and how processes interact with each other. Only what is specifically allowed by the rules is permitted. By default, every operation is denied and audited. The audited log will be saved in file /var/log/audit/audit.log or /var/log/messages depending on whether audit daemon (auditd) is running or not.
The command sesearch allows us to search the rules in a SELinux policy. The rules will be displayed in the following format:
allow <src_domain> <dst_type> : <class> { permission [ permission [ ... ] ] } ;
To verify that the process passwd is allowed to access the shadow password file /etc/shadow, we may issue:
$sesearch -s passwd_t -t shadow_t -c file -p write -A
and its output will be something similar to:
allow passwd_t shadow_t : file { ioctl read write create ... } ;
Processes and files are labeled with an SELinux context, which includes an SELinux user, role, type, and level. Within SELinux, all of this information are used to form the access control decisions. For performance reason, SELinux decisions are cached, and the cache is named the Access Vector Cache (AVC). In Fedora, SELinux provides a combination of Role-Based Access Control (RBAC), Type Enforcement (TE), and Multi-Level Security (MLS).
The command sestatus allows us to get the status of a system running SELinux. Here is an example output of command sestatus:
$setstatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
The output shows that the SELinux is enabled and is currently running in the enforcing mode the same as current configuration. It also tells us that the configuration root directory is /etc/selinux and a targeted policy is used for MAC. The status could be enabled, disabled, or permissive, where permissive means that SELinux should print warnings instead of enforcing. The command setenforce allows us to modify the running mode of SELinux. Changes should be made in the configuration file /etc/selinux/config if we want it be persistent.
All processes and files are labeled with a type (part of SELinux context). The option -Z allows us to find the type (security context) of a file/process. For examples:
$ls -Z /etc/shadow
----------. root root system_u:object_r:shadow_t:s0 /etc/shadow
It shows that the security context (user, role, type, level) of the file /etc/shadow is system_u:object_r:shadow_t:s0.
$ps -eZ|grep passwd
unconfined_u:unconfined_r:passwd_t:s0-s0:c0.c1023 2630 pts/0 00:00:00 passwd
It tells that the security context of the process passwd run by a regular user is unconfined_u:unconfined_r:passwd_t:s0-s0:c0.c1023.
The type of a process defines its domain. Processes are separated from each other by running in their own domains. The SELinux policy defines rules that determine how processes interact with files, and how processes interact with each other. Only what is specifically allowed by the rules is permitted. By default, every operation is denied and audited. The audited log will be saved in file /var/log/audit/audit.log or /var/log/messages depending on whether audit daemon (auditd) is running or not.
The command sesearch allows us to search the rules in a SELinux policy. The rules will be displayed in the following format:
allow <src_domain> <dst_type> : <class> { permission [ permission [ ... ] ] } ;
To verify that the process passwd is allowed to access the shadow password file /etc/shadow, we may issue:
$sesearch -s passwd_t -t shadow_t -c file -p write -A
and its output will be something similar to:
allow passwd_t shadow_t : file { ioctl read write create ... } ;
Wednesday, September 11, 2013
Tuesday, September 10, 2013
Untangle Links
How to find the terminal pathname of a file/directory? For example, the file /usr/lib64/mozilla/plugins/libjavaplugin.so will be installed by IcedTea-web java plugin. It is a symbolic link to another link. The command namei enables us to untangle links by following each pathname until the endpoint is found.
Here is an example usage and its output:
%namei /usr/lib64/mozilla/plugins/libjavaplugin.so
f: /usr/lib64/mozilla/plugins/libjavaplugin.so
d /
d usr
d lib64
d mozilla
d plugins
l libjavaplugin.so -> /etc/alternatives/libjavaplugin.so.x86_64
d /
d etc
d alternatives
l libjavaplugin.so.x86_64 -> /usr/lib64/IcedTeaPlugin.so
d /
d usr
d lib64
- IcedTeaPlugin.so
which untangles /usr/lib64/mozilla/plugins/libjavaplugin.so by following links and gets its terminal pathname:
/usr/lib64/IcedTeaPlugin.so.
Here is an example usage and its output:
%namei /usr/lib64/mozilla/plugins/libjavaplugin.so
f: /usr/lib64/mozilla/plugins/libjavaplugin.so
d /
d usr
d lib64
d mozilla
d plugins
l libjavaplugin.so -> /etc/alternatives/libjavaplugin.so.x86_64
d /
d etc
d alternatives
l libjavaplugin.so.x86_64 -> /usr/lib64/IcedTeaPlugin.so
d /
d usr
d lib64
- IcedTeaPlugin.so
which untangles /usr/lib64/mozilla/plugins/libjavaplugin.so by following links and gets its terminal pathname:
/usr/lib64/IcedTeaPlugin.so.
Monday, September 9, 2013
Practical Examples on RPM package management
Here are some practical examples on usages of rpm or yum for RPM based package management. A package name should be used as parameter in most examples, and it was omitted. A '?????' indicates that I have no clue on how to complete the task using rpm/yum. All comments are welcome if you know proper solution.
1. Install an RPM Package
rpm -ivh
yum install
2. Remove an RPM Package
rpm -evh
yum remove
3. Upgrade an RPM Package
rpm -Uvh
yum upgrade
4. List all installed RPM Packages
rpm -qa
yum list installed
5. List all (installed + available) RPM Packages
?????
yum list
6. Check dependencies of an RPM Package
rpm -qR
yum deplist
7. Query the information of Installed RPM Package
rpm -qi
yum info # both installed + available
8. List all files of an installed RPM package
rpm -ql
repoquery -ql # need to install yum-utils
9. Query a file that belongs which RPM Package
rpm -qf /path/to/file
yum whatprovides /path/to/file
10. Query the Information of RPM Package Before Installing
rpm -qip foo.rpm # rpm package needs to be downloaded first
yum info
11. Search for a Package
?????
yum search
12. Find out which package provides some feature or file
rpm -qf /path/to/file # for file only
yum whatprovides
13. List the package specific scriptlet
rpm -q --scripts
?????
1. Install an RPM Package
rpm -ivh
yum install
2. Remove an RPM Package
rpm -evh
yum remove
3. Upgrade an RPM Package
rpm -Uvh
yum upgrade
4. List all installed RPM Packages
rpm -qa
yum list installed
5. List all (installed + available) RPM Packages
?????
yum list
6. Check dependencies of an RPM Package
rpm -qR
yum deplist
7. Query the information of Installed RPM Package
rpm -qi
yum info # both installed + available
8. List all files of an installed RPM package
rpm -ql
repoquery -ql # need to install yum-utils
9. Query a file that belongs which RPM Package
rpm -qf /path/to/file
yum whatprovides /path/to/file
10. Query the Information of RPM Package Before Installing
rpm -qip foo.rpm # rpm package needs to be downloaded first
yum info
11. Search for a Package
?????
yum search
12. Find out which package provides some feature or file
rpm -qf /path/to/file # for file only
yum whatprovides
13. List the package specific scriptlet
rpm -q --scripts
?????
Saturday, September 7, 2013
Manage Autostart Applications in GNOME
After login in GNOME a lot of applications can be automatically started to make life easier. System-wide autostart applications can be found in /etc/xdg/autostart and in /usr/share/gnome/autostart. Users have choices to edit a autostart application by disabling it, editing its name, command or description; additionally, users may add their own autostart applications.
Gnome provides the tool gnome-session-properties, which allows us to add, modify and remove autostart applications. Once we are done with gnome-session-properties, new entries (files) are generated and saved in directory ~/.config/autostart/.
Here is an example file skype.desktop created and saved after adding skype as a new autostart application:
[Desktop Entry]
Type=Application
Exec=/usr/bin/skype
X-GNOME-Autostart-enabled=true
Name=Skype
A new file named gnome-keyring-ssh.desktop is created (and saved in directory ~/.config/autostart) after removing the default autostart application SSH key agent. The contents in it are the same as that in file /etc/xdg/autostart/gnome-keyring-ssh.desktop, except in one line:
X-GNOME-Autostart-enabled=false
which specifies that the autostart is disabled.
Gnome provides the tool gnome-session-properties, which allows us to add, modify and remove autostart applications. Once we are done with gnome-session-properties, new entries (files) are generated and saved in directory ~/.config/autostart/.
Here is an example file skype.desktop created and saved after adding skype as a new autostart application:
[Desktop Entry]
Type=Application
Exec=/usr/bin/skype
X-GNOME-Autostart-enabled=true
Name=Skype
A new file named gnome-keyring-ssh.desktop is created (and saved in directory ~/.config/autostart) after removing the default autostart application SSH key agent. The contents in it are the same as that in file /etc/xdg/autostart/gnome-keyring-ssh.desktop, except in one line:
X-GNOME-Autostart-enabled=false
which specifies that the autostart is disabled.
Sunday, August 25, 2013
Automated Remote Backups with Rdiff-backup
One subtle feature of rdiff-backup is that it allows users to make remote backups over Internet using SSH, which makes remote backups very secure since data transferred is encrypted.
One problem is that SSH requires a password for logging, which is not convenient if we want to run rdiff-backup as a cron job. Here we show how to initiate rdiff-backups from a central backup server, and pull data from a farm of hosts to be backed up. For security reasons, the central server uses a non-root user account (rdiffbk) to perform backups, whereas root account is used on each host being backed up. Though root accounts are used on hosts being backed up, they are protected by SSH public-key authentication mechanism with forced-command-only option.
For convenience, I'll call the central backup server canine and three hosts to be backed up beagle, shepherd and terrier. For short, only works on canine and beagle will be shown.
Here is the procedure for backup server canine:
To generate RSA type pair for host beagle, we issue
ssh-keygen -t rsa -f id_beagle-backup
where private key will be saved in file id_beagle-backup and public key id_beagle-backup.pub.
Step 2: move corresponding ssh key to each host
To move id_beagle-backup.pub to host beagle, we may choose to use any preferred method (for example, ftp, sftp, or ssh-copy-id), since public key is not sensitive. Other hosts can be done similarly.
Step 3: create SSH configuration file
To define how to connect to host beagle with backup key, we place the following lines into file ~rdiffbk/.ssh/config. Other hosts need to be configured similarly.
host beagle-backup
hostname beagle
user root
identifyfile ~rdiffbk/.ssh/id_beagle-backup
protocol 2
Step 4: create a cron job file
The following cron job file automates the remote backups daily at 200am, 210am, and 220am, respectively.
0 2 * * * rdiff-backup beagle-backup::/remote_dir beagle/remote_dir
10 2 * * * rdiff-backup shepherd-backup::/remote_dir shepherd/remote_dir
20 2 * * * rdiff-backup terrier-backup::/remote_dir terrier/remote_dir
By default setting, rdiff-backup uses SSH to pipe remote data. Therefore, both SSH server and rdiff-backup are required in hosts to be backed up.
What left on host beagle and others (shepherd, terrier) is simply to give permission to canine to access it (through SSH) and run rdiff-backup. This can be done in the following two steps:
Step I: create an authorized-keys file for root account
To enable SSH public key authentication for root account, we need to create the file /root/.ssh/authorized_keys, which consists public key for user rdiffbk@canine, forced command and other options. The public key (id_beagle-backup.pub) should be available for beagle once we have done Step 2. A sample authorized_keys file is as follows:
command="rdiff-backup --server --restrict-read-only /",from="canine",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3.... rdiffbk@canine
Here, for security reason, rdiff-backup server is restricted to real only, and
we disable port-forward, X11-forward and pty options. See here for more details.
Step II: configure SSH server for root access
As we saw here, this can be done by put the following line in the SSH server configuration file (sshd_config):
PermitRootLogin forced-commands-only
One problem is that SSH requires a password for logging, which is not convenient if we want to run rdiff-backup as a cron job. Here we show how to initiate rdiff-backups from a central backup server, and pull data from a farm of hosts to be backed up. For security reasons, the central server uses a non-root user account (rdiffbk) to perform backups, whereas root account is used on each host being backed up. Though root accounts are used on hosts being backed up, they are protected by SSH public-key authentication mechanism with forced-command-only option.
For convenience, I'll call the central backup server canine and three hosts to be backed up beagle, shepherd and terrier. For short, only works on canine and beagle will be shown.
Here is the procedure for backup server canine:
- generate one passphrase-free SSH key pair for each host being backed up,
- move corresponding ssh key to each host,
- create SSH configuration file, and
- create a cron job file
To generate RSA type pair for host beagle, we issue
ssh-keygen -t rsa -f id_beagle-backup
where private key will be saved in file id_beagle-backup and public key id_beagle-backup.pub.
Step 2: move corresponding ssh key to each host
To move id_beagle-backup.pub to host beagle, we may choose to use any preferred method (for example, ftp, sftp, or ssh-copy-id), since public key is not sensitive. Other hosts can be done similarly.
Step 3: create SSH configuration file
To define how to connect to host beagle with backup key, we place the following lines into file ~rdiffbk/.ssh/config. Other hosts need to be configured similarly.
host beagle-backup
hostname beagle
user root
identifyfile ~rdiffbk/.ssh/id_beagle-backup
protocol 2
Step 4: create a cron job file
The following cron job file automates the remote backups daily at 200am, 210am, and 220am, respectively.
0 2 * * * rdiff-backup beagle-backup::/remote_dir beagle/remote_dir
10 2 * * * rdiff-backup shepherd-backup::/remote_dir shepherd/remote_dir
20 2 * * * rdiff-backup terrier-backup::/remote_dir terrier/remote_dir
By default setting, rdiff-backup uses SSH to pipe remote data. Therefore, both SSH server and rdiff-backup are required in hosts to be backed up.
What left on host beagle and others (shepherd, terrier) is simply to give permission to canine to access it (through SSH) and run rdiff-backup. This can be done in the following two steps:
Step I: create an authorized-keys file for root account
To enable SSH public key authentication for root account, we need to create the file /root/.ssh/authorized_keys, which consists public key for user rdiffbk@canine, forced command and other options. The public key (id_beagle-backup.pub) should be available for beagle once we have done Step 2. A sample authorized_keys file is as follows:
command="rdiff-backup --server --restrict-read-only /",from="canine",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3.... rdiffbk@canine
Here, for security reason, rdiff-backup server is restricted to real only, and
we disable port-forward, X11-forward and pty options. See here for more details.
Step II: configure SSH server for root access
As we saw here, this can be done by put the following line in the SSH server configuration file (sshd_config):
PermitRootLogin forced-commands-only
Thursday, August 22, 2013
Tips on Forced Command for SSH
In general, an SSH connection invokes a remote command chosen by the client. There are times that server should decide which command the client will run. The forced command enables us to achieve this goal.
There are two ways to forced command. One is through public-key authentication configuration in the file authorized_keys as we saw here. The other is thought the usage of the keyword ForceCommand in sshd_config. To restrict users run nothing but the alpine command, we put the following line in sshd_config:
ForceCommand /usr/bin/alpine
The major difference between these two are: configuration though public-key authentication applies to one user, and each user may have her/his own option; configuration through ForceCommand keyword may be system-wide, keyword Match should be used combinedly if ForceCommand should apply to certain user(s).
What if we want the user to not only execute a single command, but few fixed commands at user's choice, such as:
With environment variable SSH_ORIGINAL_COMMAND,
the following script (wrapper.sh) wraps all permitted commands:
#!/bin/sh
# Script: /usr/local/bin/wrapper.sh
case "$SSH_ORIGINAL_COMMAND" in
"ps")
ps aux
;;
"uname")
uname -a
;;
"who")
who
;;
"rdiff")
rdiff-backup --server --restrict-read-only /
;;
*)
echo "Only the following commands are available to you:"
echo "ps, uname, who and rdiff"
exit 1
;;
esac
The configuration (sshd_config) of ForceCommand with Match (user backup) is as follows:
Match User backup
ForceCommand /usr/local/bin/wrapper.sh
To show process list on ssh server, one issues:
ssh backup@server ps
where original command "ps" was passed to the wrapper script by environment variable SSH_ORIGINAL_COMMAND.
To backup directory tree /path_to_src on server to local directory /path_to_dst, one issues:
rdiff-backup --remote-schema "ssh -C %s rdiff" backup@server::/path_to_src /path_to_dst
There are two ways to forced command. One is through public-key authentication configuration in the file authorized_keys as we saw here. The other is thought the usage of the keyword ForceCommand in sshd_config. To restrict users run nothing but the alpine command, we put the following line in sshd_config:
ForceCommand /usr/bin/alpine
The major difference between these two are: configuration though public-key authentication applies to one user, and each user may have her/his own option; configuration through ForceCommand keyword may be system-wide, keyword Match should be used combinedly if ForceCommand should apply to certain user(s).
What if we want the user to not only execute a single command, but few fixed commands at user's choice, such as:
- show process list (ps aux),
- print system information (uname -a),
- show who is logged on (who), or
- start rdiff-backup server (rdiff-backup --server --restrict-read-only /)
With environment variable SSH_ORIGINAL_COMMAND,
the following script (wrapper.sh) wraps all permitted commands:
#!/bin/sh
# Script: /usr/local/bin/wrapper.sh
case "$SSH_ORIGINAL_COMMAND" in
"ps")
ps aux
;;
"uname")
uname -a
;;
"who")
who
;;
"rdiff")
rdiff-backup --server --restrict-read-only /
;;
*)
echo "Only the following commands are available to you:"
echo "ps, uname, who and rdiff"
exit 1
;;
esac
The configuration (sshd_config) of ForceCommand with Match (user backup) is as follows:
Match User backup
ForceCommand /usr/local/bin/wrapper.sh
To show process list on ssh server, one issues:
ssh backup@server ps
where original command "ps" was passed to the wrapper script by environment variable SSH_ORIGINAL_COMMAND.
To backup directory tree /path_to_src on server to local directory /path_to_dst, one issues:
rdiff-backup --remote-schema "ssh -C %s rdiff" backup@server::/path_to_src /path_to_dst
Wednesday, August 21, 2013
Root Access Control for SSH
Sshd has a separate access control mechanism for the root (superuser). The keyword PermitRootLogin specifies its usage.
The argument (option) for PermitRootLogin must be "no", "yes'', "without-password'', or ``forced-commands-only''. If this option is set to "no'', root is not allowed to log in.
If this option is set to "without-password'', password authentication is disabled for root. However, root may login in with GSSAPIAuthentication, HostbasedAuthentication or PubkeyAuthentication, if they are set properly.
If this option is set to "forced-commands-only'', root login with public key authentication is allowed, but only if the command option is specified (which may be useful for remote backup as we saw in the example of public-key-based configuration). All other authentication methods are disabled in this setting.
The argument (option) for PermitRootLogin must be "no", "yes'', "without-password'', or ``forced-commands-only''. If this option is set to "no'', root is not allowed to log in.
If this option is set to "without-password'', password authentication is disabled for root. However, root may login in with GSSAPIAuthentication, HostbasedAuthentication or PubkeyAuthentication, if they are set properly.
If this option is set to "forced-commands-only'', root login with public key authentication is allowed, but only if the command option is specified (which may be useful for remote backup as we saw in the example of public-key-based configuration). All other authentication methods are disabled in this setting.
Public-key-based Configuration for SSH server
Public key is one of the frequently used authentication methods in SSH. To set up public-key authentication for one's account on an SSH server, one creates an authentication file named authorized_keys (for OpenSSH), and lists key and options that provide access to one's account.
Each line (SSH protocol 2) in authorized_keys may contain:
command="command": Specifies that the command to be executed
from="pattern-list": Specifies the permitted client name or IP address
no-port-forwarding: Forbids TCP forwarding
no-X11-forwarding: Forbids X11 forwarding
no-pty: Prevents tty allocation
The following example file specifies that:
the command "rdiff-backup --server --restrict-read-only /" to be executed if client is from the machine named "beagle" where no port, X11 forwarding is allowed. Notice that all settings are in one line.
command="rdiff-backup --server --restrict-read-only /",from="beagle",no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3.... root@beagle
Each line (SSH protocol 2) in authorized_keys may contain:
- An (optional) set of authorization options for the key.
- A (required) key type string: ssh-dss for a DSA key, or ssh-rsa for an RSA key.
- The (required) base64-encoded public key.
- An (optional) descriptive comment.
command="command": Specifies that the command to be executed
from="pattern-list": Specifies the permitted client name or IP address
no-port-forwarding: Forbids TCP forwarding
no-X11-forwarding: Forbids X11 forwarding
no-pty: Prevents tty allocation
The following example file specifies that:
the command "rdiff-backup --server --restrict-read-only /" to be executed if client is from the machine named "beagle" where no port, X11 forwarding is allowed. Notice that all settings are in one line.
command="rdiff-backup --server --restrict-read-only /",from="beagle",no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3.... root@beagle
Saturday, August 17, 2013
Tips on SSH Client Configuration
OpenSSH client ssh obtains configuration data from sources in the following order:
Here are some frequently used parameters:
Each configuration file contains sections separated by host specifications that applies to all matching hosts specified by the Host parameter. The host is the hostname argument given on the command line.
Hostname: Specifies the real host name to log into.
IdentityFile: Specifies a file from which the user's public key authentication identity is read.
Port: Specifies the port number to connect on the remote host (if it is not 22).
User: Specifies the user to log in as.
Here is an example configuration file (~/.ssh/config) for remote machine robert.some.net:
host bob
hostname robert.some.net
identityfile /somepath/.ssh/id_rsa_bob
port 2222
user root
With the above configuration file, once we issue:
ssh bob
which is equivalent to
ssh -i /somepath/.ssh/id_rsa_bob -p 2222 root@robert.some.net
- command-line options,
- user's configuration file (~/.ssh/config),
- system-wide configuration file (/etc/ssh/ssh_config)
For each parameter, the first obtained value will be used.
Here are some frequently used parameters:
Each configuration file contains sections separated by host specifications that applies to all matching hosts specified by the Host parameter. The host is the hostname argument given on the command line.
Hostname: Specifies the real host name to log into.
IdentityFile: Specifies a file from which the user's public key authentication identity is read.
Port: Specifies the port number to connect on the remote host (if it is not 22).
User: Specifies the user to log in as.
Here is an example configuration file (~/.ssh/config) for remote machine robert.some.net:
host bob
hostname robert.some.net
identityfile /somepath/.ssh/id_rsa_bob
port 2222
user root
With the above configuration file, once we issue:
ssh bob
which is equivalent to
ssh -i /somepath/.ssh/id_rsa_bob -p 2222 root@robert.some.net
Sunday, July 28, 2013
Rdiff-backup by Examples
Rdiff-backup is a python script that backs up one directory to another. Some features of rdiff-backup as claimed in its official site are: easy to use, creating mirror, keeping increments, and preserving all information. Here are some examples of its usage.
1. simple backing up (backup local directory foo to local directory bar):
rdiff-backup foo bar
2. simple remote backing up (backup local directory /some/local_dir to directory /whatever/remote_dir on machine hostname.net):
rdiff-backup /some/local_dir hostname.net:://whatever/remote_dir
Ssh will be used to open the necessary pipe for remote backing up.
3. simple restoring from previous backup (restore from bar/dir to foo/dir):
cp -a bar/dir foo/dir
4. simple restoring from the latest remote backup (restore from hostname.net:://whatever/remote_dir to local directory /some/local_dir):
rdiff-backup -r now hostname.net:://whatever/remote_dir /some/local_dir
5. restoring from a certain version of a remote backup (restore from backup done 15 days ago):
rdiff-backup -r 15D hostname.net:://whatever/remote_dir /some/local_dir
6. restoring from an increment file (restore file pg.py to its version dated 2011-11-30T00:28:38+08:00)
rdiff-backup
1. simple backing up (backup local directory foo to local directory bar):
rdiff-backup foo bar
2. simple remote backing up (backup local directory /some/local_dir to directory /whatever/remote_dir on machine hostname.net):
rdiff-backup /some/local_dir hostname.net:://whatever/remote_dir
Ssh will be used to open the necessary pipe for remote backing up.
3. simple restoring from previous backup (restore from bar/dir to foo/dir):
cp -a bar/dir foo/dir
4. simple restoring from the latest remote backup (restore from hostname.net:://whatever/remote_dir to local directory /some/local_dir):
rdiff-backup -r now hostname.net:://whatever/remote_dir /some/local_dir
5. restoring from a certain version of a remote backup (restore from backup done 15 days ago):
rdiff-backup -r 15D hostname.net:://whatever/remote_dir /some/local_dir
6. restoring from an increment file (restore file pg.py to its version dated 2011-11-30T00:28:38+08:00)
rdiff-backup
hostname.net:://remote-dir/rdiff-backup-data/increments/pg.py.2011-11-30T00:28:38+08:00.diff.gz /local_dir/pg.pySaturday, July 13, 2013
Some Usages of fuser on Linux Systems
Command fuser allows us to identify processes using files or sockets. Here are some example usages of fuser.
1. Identify processes using a file or directory:
fuser -v /path/to/the/fileORdirectory
2. Identify processes using a particular TCP/UDP port#:
fuser -v -n tcp port#
where option -n enables us to specify an object in a different name space, tcp port# here.
3. Kill processes that are executing a particular command:
fuser -v -k -i /path/to/the/command
where option -i specifies asking the user for confirmation before killing a process.
4. Kill processes using a particular TCP/UDP port#:
fuser -v -k -i -n tcp port#
1. Identify processes using a file or directory:
fuser -v /path/to/the/fileORdirectory
2. Identify processes using a particular TCP/UDP port#:
fuser -v -n tcp port#
where option -n enables us to specify an object in a different name space, tcp port# here.
3. Kill processes that are executing a particular command:
fuser -v -k -i /path/to/the/command
where option -i specifies asking the user for confirmation before killing a process.
4. Kill processes using a particular TCP/UDP port#:
fuser -v -k -i -n tcp port#
Monday, July 8, 2013
How to Mount LVM partitions/disks
Logical volume manager (LVM) is suitable for many occasions, e.g., managing large disk farms, easily re-sizing disk partitions on small systems, and etc. The following quote from wiki LVM page best describes its common uses:
1. scan all disks for volume groups:
vgscan
2. scan all disks for logical volumes:
lvscan
The output consists of one line for each logical volume indicating if it is active and its size.
3. change the availability of the logical volume (if it is inactive):
lvchange -a y /dev/vg_name/lv_name
where vg_name is the name of the volume group found by vgscan and lv_name name of the logical volume found by lvscan. You may use vgchange to change the availability of all logical volumes in a specified volume group.
4. mount the logic volume:
mount /dev/vg_name/lv_name /mount/point
where /mount/point is the mount point for the logic volume.
One can think of LVM as a thin software layer on top of the hard disks and partitions, which creates an illusion of continuity and ease-of-use for managing hard-drive replacement, repartitioning, and backup.Here are steps on how to mount LVM partitions/disks:
1. scan all disks for volume groups:
vgscan
2. scan all disks for logical volumes:
lvscan
The output consists of one line for each logical volume indicating if it is active and its size.
3. change the availability of the logical volume (if it is inactive):
lvchange -a y /dev/vg_name/lv_name
where vg_name is the name of the volume group found by vgscan and lv_name name of the logical volume found by lvscan. You may use vgchange to change the availability of all logical volumes in a specified volume group.
4. mount the logic volume:
mount /dev/vg_name/lv_name /mount/point
where /mount/point is the mount point for the logic volume.
Thursday, July 4, 2013
A quick and simple way to wipe a hard drive
For various reasons, it is necessary to wipe hard drives before disposing them. Writing disk with all zeros should suffice most occasions. This can be done as:
dd if=/dev/zero of=/dev/sdXY
where /dev/sdXY is the device name of the hard drive to work on. To get a better performance, we may need to set bs option, e.g.,
dd if=/dev/zero of=/dev/sdb1 bs=10M
to make dd read and write in 10M bytes at a time.
dd if=/dev/zero of=/dev/sdXY
where /dev/sdXY is the device name of the hard drive to work on. To get a better performance, we may need to set bs option, e.g.,
dd if=/dev/zero of=/dev/sdb1 bs=10M
to make dd read and write in 10M bytes at a time.
Tuesday, July 2, 2013
Some Usages of cpio
The command cpio allows us to copy files between archives and directories. There are three operation modes: output (-o), input (-i), and pass-through (-p).
To create an archive for directory tree src, we issue:
find src -print0 | cpio -ov0 > src.cpio
To extract files from its archive just created, we issue:
cpio -ivd < src.cpio
To copy files from directory tree src to directory des, we issue:
find src -print0 | cpio -pmd0 dest
To copy files from src to dest that are less than 2 days old and whose names contain 'txt', we issue:
find src -mtime -2 -print0 | grep txt | cpio -pmd0 dest
To copy files from src to dest that are less than 2 days old and which contain the word 'txt', we issue:
find src -mtime -2 | xargs grep -l txt | cpio -pmd0 dest
Combining with ssh (or, natcat if you are not concerned with security), cpio allows us to access remote hosts. Here are some example:
To backup the directory tree src on a remote host, we may issue:
find src -print0 | cpio -oaV0 -H tar -O user@remotehost:src.tar
which uses ssh to copy archive file from localhost to remote host.
To copy files from src to a remote host, we issue:
find src -print0 | cpio -oaV0 -H tar | ssh user@remotehost "cpio -imd"
To create an archive for directory tree src, we issue:
find src -print0 | cpio -ov0 > src.cpio
To extract files from its archive just created, we issue:
cpio -ivd < src.cpio
To copy files from directory tree src to directory des, we issue:
find src -print0 | cpio -pmd0 dest
To copy files from src to dest that are less than 2 days old and whose names contain 'txt', we issue:
find src -mtime -2 -print0 | grep txt | cpio -pmd0 dest
To copy files from src to dest that are less than 2 days old and which contain the word 'txt', we issue:
find src -mtime -2 | xargs grep -l txt | cpio -pmd0 dest
Combining with ssh (or, natcat if you are not concerned with security), cpio allows us to access remote hosts. Here are some example:
To backup the directory tree src on a remote host, we may issue:
find src -print0 | cpio -oaV0 -H tar -O user@remotehost:src.tar
which uses ssh to copy archive file from localhost to remote host.
To copy files from src to a remote host, we issue:
find src -print0 | cpio -oaV0 -H tar | ssh user@remotehost "cpio -imd"
Monday, July 1, 2013
Access UFS File System under Linux
Unix file system (UFS) is widely used in many Unix systems, for example, FreeBSD, OpenBSD, and HP-UX. There are times that we need to access UFS under Linux systems. The following command allows us to mount UFS2 for read-only (ro) under Linux systems:
mount -t ufs -o ufstype=ufs2,ro /dev/sdXY /mnt/path
Write support for UFS is not compiled into Linux kernels by default. One needs to properly configure and compile kernels for write support.
mount -t ufs -o ufstype=ufs2,ro /dev/sdXY /mnt/path
Write support for UFS is not compiled into Linux kernels by default. One needs to properly configure and compile kernels for write support.
Saturday, June 29, 2013
Netcat for File Transfer
File transfer is one of the most practical usages of netcat.
To transfer a file named filename from client to server, we first issue the following command on server:
nc -l -p 1234 > filename
where 1234 is the port number used by the server. On the client side, we issue:
nc -q 10 server 1234 < filename
where '-q 10' specifies to wait 10 seconds and then quit after EOF on stdin. This would cause the server to quit.
To transfer a director tree named /path from client to server, we issue the following command on server:
nc -l -p 1234 | tar xvzf -
On the client side, we issue:
tar cvzf - /path | nc -q 10 server 1234
If we want to reverse the direction of file transfer, i.e., client pulls file from server, we use:
nc -q 10 -l -p 1234 < filename
on server, and
nc server 1234 > filename
on client. Similarly, to reverse the direction of directory tree transfer, we use:
tar cvzf - /path | nc -q 10 -l -p 1234
on server, and
nc server 1234 | tar xvzf -
on client.
To transfer a file named filename from client to server, we first issue the following command on server:
nc -l -p 1234 > filename
where 1234 is the port number used by the server. On the client side, we issue:
nc -q 10 server 1234 < filename
where '-q 10' specifies to wait 10 seconds and then quit after EOF on stdin. This would cause the server to quit.
To transfer a director tree named /path from client to server, we issue the following command on server:
nc -l -p 1234 | tar xvzf -
On the client side, we issue:
tar cvzf - /path | nc -q 10 server 1234
If we want to reverse the direction of file transfer, i.e., client pulls file from server, we use:
nc -q 10 -l -p 1234 < filename
on server, and
nc server 1234 > filename
on client. Similarly, to reverse the direction of directory tree transfer, we use:
tar cvzf - /path | nc -q 10 -l -p 1234
on server, and
nc server 1234 | tar xvzf -
on client.
Thursday, June 27, 2013
Using findutils to delete files
Here is a summary from the deleting files page.
The most efficient and secure method to delete any file with name ending in '~' in the directory /path is:
find /path -name \*~ -delete
Using command xargs may allow us to achieve same efficiency but is not as secure:
find /path -name \*~ -print0 | xargs -0 /bin/rm
where '-print0' specifies using ASCII NUL to separate the entries in the file list, and similarly '-0' for command xargs.
If the '-delete' action is not available, we may use action '-execdir' or '-exec':
find /path -name \*~ -execdir /bin/rm {} \+
find /path -name \*~ -exec /bin/rm {} \+
Action '-execdir' is secure but less portable. On the other hand, action '-exec' is most efficient portable but insecure. These two actions can be used for doing things other than deleting files.
The most efficient and secure method to delete any file with name ending in '~' in the directory /path is:
find /path -name \*~ -delete
Using command xargs may allow us to achieve same efficiency but is not as secure:
find /path -name \*~ -print0 | xargs -0 /bin/rm
where '-print0' specifies using ASCII NUL to separate the entries in the file list, and similarly '-0' for command xargs.
If the '-delete' action is not available, we may use action '-execdir' or '-exec':
find /path -name \*~ -execdir /bin/rm {} \+
find /path -name \*~ -exec /bin/rm {} \+
Action '-execdir' is secure but less portable. On the other hand, action '-exec' is most efficient portable but insecure. These two actions can be used for doing things other than deleting files.
Tuesday, June 25, 2013
Use command find to clean up your file system
Some editors create back-up files with the the same file name and a '~' suffix. Once you are done with editing, there is no need to keep these back-up files. The command find allows us to find and remove all such back-up files in working directory:
find . -name \*~ -exec rm {} \;
If you want to remove files not been accessed for more than one year (365 days), you may issue:
find . -atime +365 -exec rm {} \;
Command find comes with many other options, for example, you may use: 'mtime' for last modified, 'ctime' for last change, or even 'inum' for inode number.
find . -name \*~ -exec rm {} \;
If you want to remove files not been accessed for more than one year (365 days), you may issue:
find . -atime +365 -exec rm {} \;
Command find comes with many other options, for example, you may use: 'mtime' for last modified, 'ctime' for last change, or even 'inum' for inode number.
Subscribe to:
Posts (Atom)