SFTPとSSHの特別グループdeveloper
で「通常の」ユーザーを拘留したいと考えています。SFTP + SSHの刑務所ユーザー
ユーザは(下にスクリプトを参照)、ユーザはコマンドのみの制限を実行することができ、SSH上/srv/DEVELOPMENT
(SSH/SFTP)にANDをナビゲートすることができます。
なぜこれが欲しいですか?
私は少しのプロジェクトで作業します。最後の日、別の開発者は自分の経験でプロジェクトをサポートすることを望んでいませんでした。開発者は「開発者のウェブサイト」を編集して、Node.js
アプリケーションをSSH経由で起動/停止/再起動することができます。次の考えは次のとおりです。ユーザーはシェルを使用してアカウントのパスワードを変更する必要があります。
現在、私は次の手順でSSH-デーモンを設定している:
刑務所をSFTP
Match Group developer
X11Forwarding no
AllowTcpForwarding yes
ChrootDirectory /srv/DEVELOPMENT
ForceCommand internal-sftp
ユーザーが追加された上で以下のコマンド/オプションによって:
useradd --base-dir /srv/ --home-dir /srv/ --no-user-group --shell /srv/shell.sh $USERNAME
usermod -G developer $USERNAME
id $USERNAME
passwd $USERNAME
現在のディレクトリアクセス許可
/srv developer:root 0755
/srv/DEVELOPMENT developer:root 0750
/srv/DEVELOPMENT/* developer:root 0777
SFTP
と正しく動作します。 第2部は現在SSHでユーザーを拘束していますが、現在は少し難しくなっています。この手順は現時点では動作しません。とthatsは私の質問です。
chrootはinternal-sfpt
に限定されています。私がログインしようとすると、接続は接続のみSFTPのために許可されていることを、メッセージとともに中止されます。ここでは
ssh [email protected]
[email protected]'s password:
This service allows sftp connections only.
Connection to example.com closed.
は、私は、SSH-デーモン設定にForceCommand
を削除していた>ログインは成功します。
しかし、ここでは私の問題である
私がログインしようとすると、何も実行ファイルは使用されませカント:
ssh [email protected]
[email protected]'s password:
Linux example.com 4.9.0-3-amd64 #1 SMP Debian 4.9.30-2+deb9u2 (2017-06-26) x86_64
Last login: Sun Jul 30 18:00:11 2017 from ****************
/srv/shell.sh: No such file or directory
Connection to example.com closed.
/srv/shell.sh
はサンプルのため、コマンドを制限するために、カスタムシェルスクリプトです:
#!/bin/bash
commands=("man" "passwd" "ls" "account", "whoami", "clear", "cd")
RED='\033[0;31m'
YELLOW='\033[0;33m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
INDENTATION=' '
SYSTEM_UPTIME=`uptime --pretty`
SYSTEM_USERS=`who -q`
SYSTEM_QUOTA="None"
SYSTEM_RAM="None"
timestamp(){
date +"%Y-%m-%d %H:%M:%S"
}
log(){
echo -e "[$(timestamp)]\t$1\t$(whoami)\t$2" >> /var/log/developer-user/shell.log;
}
execute() {
# EXIT
if [[ "$ln" == "exit" ]] || [[ "$ln" == "q" ]]
then
exit
# HELP
elif [[ "$ln" == "help" ]]
then
echo "Type exit or q to quit."
echo "Commands you can use:"
echo " account"
echo " help"
echo " echo"
echo " man <ManPage>"
echo " passwd"
echo " ls"
echo " clear"
echo " cd"
# CD
elif [[ "$ln" =~ ^cd\ .*$ ]]
then
LAST=`pwd`
$ln
CURRENT=`pwd`
if [[ $CURRENT == "/srv" ]]
then
log CHANGE_DIR FAILED_PERMISSIONS "$ln"
echo -e "${RED}ERROR:${NC} Sorry, you can't change to the previous directory ${YELLOW}\"${CURRENT}\"${NC}."
cd $LAST
elif [[ ! "$CURRENT" =~ ^/srv/DEVELOPMENT ]]
then
log CHANGE_DIR FAILED_PERMISSIONS "$ln"
echo -e "${RED}ERROR:${NC} Sorry, you can't change to the directory ${YELLOW}\"${CURRENT}\"${NC}."
cd $LAST
elif [[ `stat -c "%G" ${CURRENT}` == "friendlounge" ]]
then
log CHANGE_DIR "$ln"
else
log CHANGE_DIR FAILED_PERMISSIONS "$ln"
echo -e "${RED}ERROR:${NC} You have no permissions on ${YELLOW}\"${CURRENT}\"${NC}."
cd $LAST
fi
# ECHO
elif [[ "$ln" =~ ^echo\ .*$ ]]
then
$ln
log COMMAND "$ln"
# ACCOUNT
elif [[ "$ln" = "account" ]]
then
echo -e "YOUR ACCOUNT:"
echo -e "Username: $(whoami)"
# OTHERS
else
ok=false
for cmd in "${commands[@]}"
do
if [[ "$cmd" == "$ln" ]]
then
ok=true
fi
done
if $ok
then
$ln
else
echo -e "${RED}ERROR:${NC} You have no permissions to execute ${YELLOW}\"${ln}\"${NC}."
log DENIED "$ln"
fi
fi
}
# WELCOME MESSAGE
echo -e "${INDENTATION}${MAGENTA}Account:${NC}${INDENTATION}$(whoami)"
echo -e "${INDENTATION}${MAGENTA}Date:${NC}${INDENTATION}${INDENTATION}$(timestamp)"
echo -e "${INDENTATION}${MAGENTA}Uptime:${NC}${INDENTATION}${INDENTATION}${SYSTEM_UPTIME}"
echo -e "${INDENTATION}${MAGENTA}Users:${NC}${INDENTATION}${INDENTATION}${SYSTEM_USERS}"
echo -e "${INDENTATION}${MAGENTA}Quota:${NC}${INDENTATION}${INDENTATION}${SYSTEM_QUOTA}"
echo -e "${INDENTATION}${MAGENTA}RAM:${NC}${INDENTATION}${INDENTATION}${SYSTEM_RAM}"
log LOGIN "[email protected]"
cd
trap "trap=\"\";log LOGOUT;exit" EXIT
# Optionally check for '-c custom_command' arguments passed directly to shell
# Then you can also use ssh [email protected] custom_command, which will execute /root/rbash.sh
if [[ "$1" == "-c" ]]
then
shift
execute "[email protected]"
else
while echo -e -n "${RED}$(whoami)${YELLOW}@${CYAN}$(hostname) ${YELLOW}$(pwd) ${MAGENTA}#${NC} " && read ln
do
execute "$ln"
done
fi
このシェルスクリプトは、ユーザのpermission
をチェックし、強制的に0にしますディレクトリまたはサブディレクトリ。
/bin/bash
などの別のログインシェルを設定することは関係ありません。ログインごとに、エラーメッセージXXXX: No such file or directory
の後にSSHデーモンが接続を閉じます。
私は別のアクセス許可などを設定しようとしていました。私はsshを介して接続するために問題を解決することはできません。
誰でも知っていますか?
あなたは
- に答える前にはい、私はいいえ、私は「ドン(サンプルのため、私の「自分」シェルのログインスクリプトを介してアクセス権を管理するための)可能なセキュリティ上の理由
- を知ら
schroot
またはjailkit
のような巨大な選択肢をインストールしたいのですが、最初の分を読んで、これらの選択肢は仮想マシン(?)のように完全に分離されたシステムを使用しています - 明示的な情報が間違っている場合に通知してください)
? – spinkus
重複:https://stackoverflow.com/a/32653528/2196426 – Jakuje
@spinkusいいえ、私は/srv/shell.shを意味します。 –