This might be useful for those wanting to do server administration functions
(start/stop tomcat, reboot, stats, etc) out of an Xwiki doc (make sure your
doc is password protected or more, if it allows people to reboot your
server!; Anything needing root or tomcat user would use /etc/sudoers to
grant specfic permissions to specific programs needed by user
tomcat-ssh-slave):

Input:

> ==== Use Groovy Script run server processes and display result ====


> See [[SshHelperClass?viewer=code]], [[
> http://blog.asyd.net/2008/12/xwiki-cest-decidemment-magique/]]


> ==== Call parseGroovyFromPage("Groovy.SshHelperClass") ====

{{velocity}}

#set( $sshHelper = $xwiki.parseGroovyFromPage("Groovy.SshHelperClass") )

$sshHelper.openSession("127.0.0.1", "22", "tomcat-ssh-slave",
> "/usr/share/tomcat6/.ssh/id_dsa", "")

{{/velocity}}


> ==== Output from 'uname -a'====

##{{velocity}}$sshHelper.runCommand("uname -a"){{/velocity}}##


> ==== Output from 'free' ====

##{{velocity}}$sshHelper.runCommand("free"){{/velocity}}##


> ==== Output from 'ps -l U tomcat-ssh-slave U tomcat U apache' ====

##{{velocity}}$sshHelper.runCommand("ps -l h U tomcat-ssh-slave U tomcat U
> apache"){{/velocity}}##


> ==== Output from 'df -H' ====

##{{velocity}}$sshHelper.runCommand("df -H"){{/velocity}}##


> ==== Output from 'top -b -n 1' ====

##{{velocity}}$sshHelper.runCommand("top -b -n 1"){{/velocity}}##


> ==== Close the connection and exit tomcat-ssh-slave shell ====

warning: if something breaks above, hopefully this will get called otherwise
> we

get a left-over sub-process tomcat-ssh-slave

##{{velocity}}$sshHelper.close(){{/velocity}}##


Output:

> Use Groovy Script run server processes and display result
>
> See SshHelperClass ,
>> http://blog.asyd.net/2008/12/xwiki-cest-decidemment-magique/
>
> *Call parseGroovyFromPage("Groovy.SshHelperClass")*
>
> *Output from 'uname -a'*
>
> Linux ce 2.6.27.29-170.2.78.fc10.x86_64 #1 SMP Fri Jul 31 04:16:20 EDT
>> 2009 x86_64 x86_64 x86_64 GNU/Linux
>
> *Output from 'free'*
>
> total used free shared buffers cached
>
> Mem: 1928992 1778932 150060 0 47272 532128
>
> -/+ buffers/cache: 1199532 729460
>
> Swap: 3866616 78776 3787840
>
> *Output from 'ps -l U tomcat-ssh-slave U tomcat U apache'*
>
> 5 S 92 18792 18788 0 80 0 - 22060 select ? 0:00 sshd:
>> tomcat-ssh-sl...@notty
>
> 0 R 92 18879 18792 1 80 0 - 22453 - ? 0:00 ps -l h U tomcatssh-slave U
>> tomcat U apache
>
> 0 S 91 31695 1 0 80 0 - 463955 futex_ ? 7:47 /usr/java/default/bin/java
>> -server -Xms160m -Xmx1024m -XX:PermSize=160m -XX:MaxPermSize=320m ...
>
> *Output from 'df -H'*
>
> Filesystem Size Used Avail Use% Mounted on
>
> /dev/mapper/VolGroup00-LogVol00 242G 26G 204G 12% /
>
> /dev/sda1 200M 15M 175M 8% /boot
>
> tmpfs 988M 353k 988M 1% /dev/shm
>
> *Output from 'top -b -n 1'*
>
> top - 11:17:20 up 2 days, 16:21, 3 users, load average: 0.78, 0.68, 0.56
>
> Tasks: 150 total, 2 running, 148 sleeping, 0 stopped, 0 zombie
>
> Cpu(s): 7.7%us, 1.7%sy, 0.0%ni, 90.2%id, 0.3%wa, 0.1%hi, 0.1%si, 0.0%st
>
> Mem: 1928992k total, 1794420k used, 134572k free, 47304k buffers
>
> Swap: 3866616k total, 78776k used, 3787840k free, 532356k cached
>
>  ...
>
>
Special Installation Instructions

To make this run (Fedora Linux):
1. sudo yum install trilead-ssh2 trilead-ssh2-javadoc
2. sudo ln -s /usr/share/java/trilead-ssh2-213.jar
/usr/share/java/tomcat6/trilead-ssh2.jar
3. Make sure "tomcat" user exists in /etc/passwd, and create an additional
uid=92 gid=92 account "tomcat-ssh-slave":
• tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/bin/sh
° "tomcat" user created as "disabled" by installing tomcat6-6.0.18-6.2.fc10
• tomcat-ssh-slave:x:92:92:User for SSH Subprocesses From
Tomcat:/home/tomcat-ssh-slave:/bin/bash
° create this using fedora admin utility 'system-config-users' or by
hand-editing /etc/passwd...
4. sudo passwd -u tomcat
• unlock tomcat account temporarily
5. sudo passwd tomcat
• set password for tomcat account
6. Login to "tomcat" account using SSH from current account terminal.
7. ssh-keygen -t dsa
• Leave "empty for no passphrase" for decrypting the DSA-key produced by
ssh-keygen, although it can be specified as last parameter for
sshHelper.openSession("localhost", "22", "tomcat-ssh-slave",
"/usr/share/tomcat6/.ssh/id_dsa", "").
8. From the "tomcat" account, run "ssh [email protected]"
• answer Yes: "Are you sure you want to continue connecting (yes/no)? yes"
• enter password for tomcat-ssh-slave set above via system-config-users.
• exit the connection.
• The purpose of this step is to test the account, and init
/usr/share/tomcat6/.ssh/known_hosts
9. sudo cp /usr/share/tomcat6/.ssh/id_dsa.pub
tomcat-ssh-slave/.ssh/authorized_keys
10. From the "tomcat" account, do "ssh [email protected]" again
• verify that login happens w/o password prompt, which is what happens when
authorized_keys is set to the
public key of the account accessing SSH.
• exit from tomcat-ssh-slave account. It's now ready to run out of tomcat.
11. passwd -l tomcat
• lock the tomcat account from further logins, now that it's been setup and
the dsa public/private keys have been generated.

1. *TODO:* remove password from user tomcat-ssh-slave ('!!' in passwd field
of /etc/shadow) password not needed for login
2. *TODO:* alternately, is there a local customization to ensure certs only
used for login to the account? I know this can be done globally in
/etc/ssh/sshd_config: "PasswordAuthentication no" and "PermitEmptyPasswords
no"
3. *TODO:* for user tomcat-ssh-slave, integrate "limited command processing"
by replacing /bin/sh as login shell with /usr/local/bin/tomcat-ssh-shell (or
equiv):

#!/bin/sh -noprofile
###############################################################################
#
# File:         sshslave-shell
# RCS:          $Header: $
# Description: Shell to allow execution of remote commands from a tomcat
server.
# For security purposes, this "login" is limited in commands it can
# perform, and runs as a separate user from the tomcat server, separating
# the ability to directly modify tomcat state from the functionality
provided
# by user tomcat-ssh-slave. This shell is run as the "login shell" (via
# /etc/passwd) for account tomcat-ssh-slave, which is accessed via SSH.
# The account is preferably a nonprivileged user account with pid>500, Home
# directory /home/tomcat-ssh-slave must exist, with correct permisssions.
#               /home/tomcat-ssh-slave contains scripts referred to via
fully qualified
# filenames in this script. The directory would also store the accounts'
# .ssh settings, keys, etc. Secure, password-less access to the
tomcat-ssh-slave
# account can be achieved by having tomcat's SSH public identity
/usr/share/tomcat6/.ssh/id_dsa.pub
#        installed as /home/tomcat-ssh-slave/.ssh/authorized_keys (and
keeping id_dsa secret)
# This would prevent use of tomcat-ssh-slave "account" from being used by
anything
# other than preauthorized accounts.
#
# Here's some example commands:
#
# ssh -x [email protected] cleanlog
# ssh -x [email protected] getlog
# ssh -x [email protected] setdbglvl 'INFO'
# ssh -x [email protected] getdbglvl
# ssh -x [email protected] tomcat-restart
# ssh -x [email protected] apache-restart
# ssh -x [email protected] tomcat-start
# ssh -x [email protected] apache-start
# ssh -x [email protected] top
# ssh -x [email protected] ps
# ssh -x [email protected] df
# ssh -x [email protected] free
# ssh -x [email protected] reboot
# Author:       Niels P. Mayer
# Created:      Monday 8/10/2009
# Modified:
# Language:     Shell-script
# Package:      N/A
# Status:       Production
#
# (C) Copyright 2009, Niels Mayer, all rights reserved.
#
###############################################################################

# make sure nothing funny goes on
PATH="/bin:/usr/bin"

# make sure they rsh or ssh in with a single command
if [ -z "$1" ] || [ "$1" != "-c" ]
then
   echo You must use ssh -c to access this account
   exit 1
else
   shift
   SSHSLAVE_COMMAND="$@"
fi

# only let them run specific commands, eg.
# ssh -x [email protected] cleanlog
# ssh -x [email protected] getlog
# ssh -x [email protected] setdbglvl 'INFO'
# ssh -x [email protected] getdbglvl
# ssh -x [email protected] tomcat-restart
# ssh -x [email protected] apache-restart
# ssh -x [email protected] tomcat-start
# ssh -x [email protected] apache-start
# ssh -x [email protected] top
# ssh -x [email protected] ps
# ssh -x [email protected] df
# ssh -x [email protected] free
# ssh -x [email protected] reboot

case ${SSHSLAVE_COMMAND} in
    cleanlog \
    getlog \
    getdbglvl \
    tomcat-restart \
    apache-restart \
    tomcat-start \
    apache-start \
    top \
    ps \
    df \
    free \
    reboot \
    ) #single argument commands -- exact match to SSHSLAVE_COMMAND
exec "/home/tomcat-ssh-slave/${SSHSLAVE_COMMAND}"
;;

    setdbglvl* \ #e.g., setdbglvl 'INFO' ... multiple argument command.
Beware command injection.
    )
exec `echo "/home/tomcat-ssh-slave/${SSHSLAVE_COMMAND}" | cut -f1 -d" "`
`echo "${SSHSLAVE_COMMAND}" | cut -f2- -d" "`
;;
    * )
exec echo You are not authorized to do that.
;;
esac



Niels
http://nielsmayer.com
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to