Fix x11vnc. Add FSTEC-HARDENING-ADVISED

master
Dmitry Razumov 3 months ago
parent dd2ad023c2
commit 8bec314896
Signed by: asmeron
GPG Key ID: 50BC1DB583B79706

@ -62,19 +62,21 @@ ere_quote_sed() {
# phash # Если первые символы %%, то убрать %% и вернуть не шифрованный пароль, в остальных случаях вернуть хеш # phash # Если первые символы %%, то убрать %% и вернуть не шифрованный пароль, в остальных случаях вернуть хеш
# $2 # Тип хеша, поддерживаются yescrypt|gost-yescrypt|scrypt|bcrypt|bcrypt-a|sha512crypt|sha256crypt|sunmd5|md5crypt|bsdicrypt|descrypt|nt # $2 # Тип хеша, поддерживаются yescrypt|gost-yescrypt|scrypt|bcrypt|bcrypt-a|sha512crypt|sha256crypt|sunmd5|md5crypt|bsdicrypt|descrypt|nt
# # В разработке argon2d|argon2i|argon2ds|argon2id # # В разработке argon2d|argon2i|argon2ds|argon2id
# $3 # Пароль пользователя шифрованный или не шифрованный. Если шифрованный, то вернётся как есть # $3 # Пароль пользователя шифрованный или не шифрованный. Если шифрованный, то вернётся как есть.
# Применяется в ubconfig # Применяется в ubconfig, 10-accounts
return_hash_password(){ return_hash_password(){
SOURCE=${SYSCONF}/users; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${SYSCONF}/users; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
DEFAULT_HASHPASSWD="yescrypt" local DEFAULT_HASHPASSWD="yescrypt"
[[ $1 == @(hash|phash) ]] && local ARG_MODE=$1 && shift local ARG_HASH=
[[ $1 == @(hash|phash) ]] && ARG_MODE=$1 && shift
[[ -n ${ARG_MODE} ]] || ARG_MODE='hash' [[ -n ${ARG_MODE} ]] || ARG_MODE='hash'
[[ $1 == @(yescrypt|gost-yescrypt|scrypt|bcrypt|bcrypt-a|sha512crypt|sha256crypt|sunmd5|md5crypt|bsdicrypt|descrypt|nt|argon2d|argon2i|argon2ds|argon2id) ]] && local ARG_HASH=$1 && shift [[ $1 == @(yescrypt|gost-yescrypt|scrypt|bcrypt|bcrypt-a|sha512crypt|sha256crypt|sunmd5|md5crypt|bsdicrypt|descrypt|nt|argon2d|argon2i|argon2ds|argon2id) ]] && ARG_HASH=$1 && shift
[[ -n ${ARG_HASH} ]] || ARG_HASH=${HASHPASSWD} [[ -n ${ARG_HASH} ]] || ARG_HASH=${HASHPASSWD}
[[ -n ${ARG_HASH} ]] || ARG_HASH=$(${ROOTFS}/usr/bin/ubconfig --raw --default get users HASHPASSWD) [[ -n ${ARG_HASH} ]] || ARG_HASH=$(${ROOTFS}/usr/bin/ubconfig --raw --default get users HASHPASSWD)
[[ -n ${ARG_HASH} && ${ARG_HASH} != "(null)" ]] || ARG_HASH="${DEFAULT_HASHPASSWD}" [[ -n ${ARG_HASH} && ${ARG_HASH} != "(null)" ]] || ARG_HASH="${DEFAULT_HASHPASSWD}"
local ARG_PASSWORD="$1" local ARG_PASSWORD="$1"
local HASH_PASSWORD=${ARG_PASSWORD} local HASH_PASSWORD=${ARG_PASSWORD}
local BLOCK_PASSWORD=
[[ -n ${ARG_PASSWORD} ]] || return 0 [[ -n ${ARG_PASSWORD} ]] || return 0
if [[ ! ${ARG_PASSWORD} =~ ^('!*'|'!'|'!!'|'*')*'$'(_|1|2|2a|2b|2x|2y|3|4|5|6|7|md5|sha1|gy|y|argon2d|argon2i|argon2ds|argon2id)'$' ]]; then if [[ ! ${ARG_PASSWORD} =~ ^('!*'|'!'|'!!'|'*')*'$'(_|1|2|2a|2b|2x|2y|3|4|5|6|7|md5|sha1|gy|y|argon2d|argon2i|argon2ds|argon2id)'$' ]]; then
[[ ${ARG_PASSWORD} =~ ^'%%'(.*) ]] && ARG_PASSWORD=${BASH_REMATCH[1]} && HASH_PASSWORD=${ARG_PASSWORD} || ARG_MODE='hash' [[ ${ARG_PASSWORD} =~ ^'%%'(.*) ]] && ARG_PASSWORD=${BASH_REMATCH[1]} && HASH_PASSWORD=${ARG_PASSWORD} || ARG_MODE='hash'
@ -98,6 +100,39 @@ return_hash_password(){
echo "${BLOCK_PASSWORD}${HASH_PASSWORD}" echo "${BLOCK_PASSWORD}${HASH_PASSWORD}"
} }
# Получить хеш пароля base64
# $1 # Режим получения хеша, значения: hash, phash
# hash # Вернуть хеш, если первые символы %%, то удалить их и вернуть хеш
# phash # Если первые символы %%, то убрать %% и вернуть не шифрованный пароль, в остальных случаях вернуть хеш
# decode # Если хеш, то декодировать в пароль
# $2 # Пароль пользователя шифрованный или не шифрованный. Если шифрованный, то вернётся как есть.
# Применяется в ubconfig, 41-x11vnc
return_base64_password(){
local ARG_HASH=
[[ $1 == @(hash|phash|decode) ]] && ARG_MODE=$1 && shift
[[ -n ${ARG_MODE} ]] || ARG_MODE='hash'
local ARG_PASSWORD="$1"
local HASH_PASSWORD=${ARG_PASSWORD}
[[ -n ${ARG_PASSWORD} ]] || return 0
if [[ ${ARG_MODE} == 'decode' ]]; then
if [[ ${ARG_PASSWORD} =~ ^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=|[A-Za-z0-9+/][AQgw]==)?$ ]]; then
HASH_PASSWORD=$(${ROOTFS}/usr/bin/base64 -d <<< "${ARG_PASSWORD}" 2>/dev/null)
[[ ${HASH_PASSWORD} = *[^[:print:]]* ]] && HASH_PASSWORD=${ARG_PASSWORD}
else
[[ ${ARG_PASSWORD} =~ ^'%%'(.*) ]] && ARG_PASSWORD=${BASH_REMATCH[1]} && HASH_PASSWORD=${ARG_PASSWORD}
fi
else
if [[ ! ${ARG_PASSWORD} =~ ^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=|[A-Za-z0-9+/][AQgw]==)?$ ]]; then
[[ ${ARG_PASSWORD} =~ ^'%%'(.*) ]] && ARG_PASSWORD=${BASH_REMATCH[1]} && HASH_PASSWORD=${ARG_PASSWORD} || ARG_MODE='hash'
[[ ${ARG_MODE} == 'hash' ]] && HASH_PASSWORD=$(${ROOTFS}/usr/bin/base64 <<< "${ARG_PASSWORD}" 2>/dev/null)
else
HASH_PASSWORD_TEST=$(return_base64_password decode "${ARG_PASSWORD}")
[[ ${ARG_PASSWORD} == ${HASH_PASSWORD_TEST} ]] && HASH_PASSWORD=$(${ROOTFS}/usr/bin/base64 <<< "${ARG_PASSWORD}" 2>/dev/null)
fi
fi
echo "${HASH_PASSWORD}"
}
# External: ubl-settings-usergroups # External: ubl-settings-usergroups
# #
# Если параметр $1 известный хеш, то вернуть true, иначе false # Если параметр $1 известный хеш, то вернуть true, иначе false
@ -965,7 +1000,7 @@ ubconfig_exec_system(){
LIGHTDM_XDMCP) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/60-lightdm-settings exec_lightdm_xdmcp "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; LIGHTDM_XDMCP) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/60-lightdm-settings exec_lightdm_xdmcp "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;;
LIGHTDM_XDMCP\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/60-lightdm-settings exec_lightdm_xdmcp "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; LIGHTDM_XDMCP\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/60-lightdm-settings exec_lightdm_xdmcp "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;;
LIGHTDM_GREETER\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/60-lightdm-settings exec_lightdm_greeter "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; LIGHTDM_GREETER\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/60-lightdm-settings exec_lightdm_greeter "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;;
X11VNC\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.local.d/41-x11vnc ;; X11VNC\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.local.d/41-x11vnc exec_x11vnc "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;;
*) NO_FIND_EXCUTE=1 ;; *) NO_FIND_EXCUTE=1 ;;
esac esac
;; ;;

@ -10,9 +10,10 @@ ENABLED=yes
[[ ${ENABLED} == yes ]] || exit 0 [[ ${ENABLED} == yes ]] || exit 0
DEBUGMODE=no DEBUGMODE=no
SELF_FILE=${SSC_ARGV0:-${0}}; SELF_NAME=${SELF_FILE##*/}; SELF_PATH=${SELF_FILE%/*}
[[ ! -f /init ]] && { ROOTFS= ; CMD_CHROOT= ; } || { [[ -d /sysroot ]] && ROOTFS="/sysroot" || ROOTFS="."; CMD_CHROOT="chroot ${ROOTFS}"; } [[ ! -f /init ]] && { ROOTFS= ; CMD_CHROOT= ; } || { [[ -d /sysroot ]] && ROOTFS="/sysroot" || ROOTFS="."; CMD_CHROOT="chroot ${ROOTFS}"; }
SOURCE=${ROOTFS}/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${ROOTFS}/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
debug_mode "${SSC_ARGV0:-$0}" "$@" debug_mode "${SELF_FILE}" "$@"
SOURCE=${ROOTFS}/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${ROOTFS}/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SYSCONF="${ROOTFS}${SYSCONF}" SYSCONF="${ROOTFS}${SYSCONF}"
@ -56,19 +57,19 @@ SOURCE=${FILE_ROOT_USERS}; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
## Отключить автоматическое создание X11VNC для всех дисплеев ## Отключить автоматическое создание X11VNC для всех дисплеев
## X11VNC[display]=disable || X11VNC[nodisplay]=1 || X11VNC[disable]=1 ## X11VNC[display]=disable || X11VNC[nodisplay]=1 || X11VNC[disable]=1
exec_x11vnc(){ exec_x11vnc(){
systemctl --quiet --wait is-system-running x11vnc_service_enable(){
if [[ -n ${X11VNC[@]} ]]; then
OPTION_GLOBAL="-many -shared -no6" OPTION_GLOBAL="-many -shared -no6"
# OPTION_GLOBAL="-many -shared -no6 -forever -dontdisconnect -noxdamage -xkb -rfbport 590%i " #OPTION_GLOBAL="-many -shared -no6 -forever -dontdisconnect -noxdamage -xkb -rfbport 590%i "
if [[ -n ${X11VNC[password]} ]]; then if [[ -n ${X11VNC[password]} ]]; then
PLAIN_PASSWORD=$(${ROOTFS}/usr/lib/ublinux/functions return_base64_password decode "${X11VNC[password]}")
# Добавить параметр в ${FILE_ROOT_USERS}=".users_credential" и удалить параметр X11VNC[password] из '/etc/ublinux/desktop # Добавить параметр в ${FILE_ROOT_USERS}=".users_credential" и удалить параметр X11VNC[password] из '/etc/ublinux/desktop
if [[ -f ${FILE_ROOT_USERS} ]]; then if [[ -f ${FILE_ROOT_USERS} ]]; then
sed "/X11VNC\[password\]=/d" -i "${FILE_ROOT_USERS}" sed "/X11VNC\[password\]=/d" -i "${FILE_ROOT_USERS}"
[[ -n ${X11VNC[password]} ]] && echo "X11VNC[password]='${X11VNC[password]}'" >> ${FILE_ROOT_USERS} [[ -n ${X11VNC[password]} ]] && echo "X11VNC[password]='$(${ROOTFS}/usr/lib/ublinux/functions return_base64_password hash "${X11VNC[password]}")'" >> ${FILE_ROOT_USERS}
fi fi
[[ -f "${SYSCONF}/desktop" ]] && sed -E "s/(X11VNC\[password\])=.*/\1=secret/g" -i "${SYSCONF}/desktop" [[ -f "${SYSCONF}/desktop" ]] && sed -E "s/(X11VNC\[password\])=.*/\1=secret/g" -i "${SYSCONF}/desktop"
[[ -d /root/.vnc ]] || mkdir -p /root/.vnc [[ -d /root/.vnc ]] || mkdir -p /root/.vnc
/usr/bin/x11vnc -quiet -storepasswd "$(base64 -d <<< "${X11VNC[password]}")" /root/.vnc/.passwd &>/dev/null /usr/bin/x11vnc -quiet -storepasswd "${PLAIN_PASSWORD}" /root/.vnc/.passwd &>/dev/null
chmod 600 /root/.vnc/.passwd chmod 600 /root/.vnc/.passwd
## Show obscured password ## Show obscured password
#/usr/bin/x11vnc -showrfbauth /root/.vnc/passwd #/usr/bin/x11vnc -showrfbauth /root/.vnc/passwd
@ -118,7 +119,7 @@ EOF
## Настройка VNC для TTY ## Настройка VNC для TTY
if [[ ${X11VNC_NEW} =~ ^tty[0-9]{1,2}$ ]]; then if [[ ${X11VNC_NEW} =~ ^tty[0-9]{1,2}$ ]]; then
NUM_TTY=$(sed "s/tty//" <<< ${X11VNC_NEW}) NUM_TTY=$(sed "s/tty//" <<< ${X11VNC_NEW})
X11VNC[${X11VNC_NEW}]="${OPTION_GLOBAL} -rfbauth /root/.vnc/.passwd -rawfb vt${NUM_TTY} ${X11VNC[${X11VNC_NEW}]}" X11VNC[${X11VNC_NEW}]="${OPTION_GLOBAL} ${OPTION_RFBAUTH_PASSWD} -rawfb vt${NUM_TTY} ${X11VNC[${X11VNC_NEW}]}"
fi fi
FILE_X11VNC_SERVICE="/usr/lib/systemd/system/x11vnc-ublinux-${X11VNC_NEW}.service" FILE_X11VNC_SERVICE="/usr/lib/systemd/system/x11vnc-ublinux-${X11VNC_NEW}.service"
OPTION_LOG="-o /var/log/x11vnc-ublinux-${X11VNC_NEW}.log" OPTION_LOG="-o /var/log/x11vnc-ublinux-${X11VNC_NEW}.log"
@ -156,8 +157,8 @@ EOF
[[ -f ${FILE_X11VNC_SERVICE} ]] && systemctl --quiet enable ${FILE_X11VNC_SERVICE##*/} &>/dev/null && systemctl --quiet restart ${FILE_X11VNC_SERVICE##*/} &>/dev/null [[ -f ${FILE_X11VNC_SERVICE} ]] && systemctl --quiet enable ${FILE_X11VNC_SERVICE##*/} &>/dev/null && systemctl --quiet restart ${FILE_X11VNC_SERVICE##*/} &>/dev/null
fi fi
done done
else }
## Если в режиме полного сохранения настройку убрали, то отключаем x11vnc_service_disable(){
local DAEMON_RELOAD= local DAEMON_RELOAD=
[[ -f ${FILE_ROOT_USERS} ]] && sed "/X11VNC\[password\]=/d" -i "${FILE_ROOT_USERS}" [[ -f ${FILE_ROOT_USERS} ]] && sed "/X11VNC\[password\]=/d" -i "${FILE_ROOT_USERS}"
[[ -f "${SYSCONF}/desktop" ]] && sed "/X11VNC\[password\]=/d" -i "${SYSCONF}/desktop" [[ -f "${SYSCONF}/desktop" ]] && sed "/X11VNC\[password\]=/d" -i "${SYSCONF}/desktop"
@ -171,6 +172,29 @@ EOF
fi fi
done done
[[ -z ${DAEMON_RELOAD} ]] || systemctl daemon-reload &>/dev/null [[ -z ${DAEMON_RELOAD} ]] || systemctl daemon-reload &>/dev/null
}
[[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift
[[ -n ${COMMAND} ]] || COMMAND="set="
local PARAM="$@"
if [[ -n ${PARAM} ]]; then
local X11VNC=
declare -A X11VNC=()
[[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && eval "${PARAM%%=*}=\${PARAM#*=}"
fi
systemctl --quiet --wait is-system-running
if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]]; then
if [[ ${#X11VNC[@]} != 0 ]]; then
x11vnc_service_enable
else
x11vnc_service_disable
fi
elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then
if [[ ${#X11VNC[@]} != 0 ]]; then
x11vnc_service_enable
else
## Если в режиме полного сохранения настройку убрали, то отключаем
x11vnc_service_disable
fi
fi fi
} }
@ -180,5 +204,16 @@ EOF
# Если файл подключен как ресурс с функциями, то выйти # Если файл подключен как ресурс с функциями, то выйти
return 0 2>/dev/null && return 0 return 0 2>/dev/null && return 0
if [[ -z $@ ]]; then
exec_x11vnc $@ while read -r FUNCTION; do
$"${FUNCTION##* }"
done < <(declare -F | grep "declare -f exec_")
else
FUNCTION=
while [[ $# -gt 0 ]]; do
# Что-бы передавать пустые параметры как аргументы, нужно для соблюдения очередности и кол-ва, отключил [[ -z ${1} ]] || {}
declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1//\'/}'"
shift
done
eval ${FUNCTION#*; }
fi

@ -427,6 +427,7 @@ VERSION=
## REPOSITORY[modules]='https://repo.ublinux.ru/2405/$repo/$arch' ## REPOSITORY[modules]='https://repo.ublinux.ru/2405/$repo/$arch'
## REPOSITORY[mymodules]=http://192.168.0.1:8080/repo/2204;;;disable ## REPOSITORY[mymodules]=http://192.168.0.1:8080/repo/2204;;;disable
## REPOSITORY[webmyrepo]=http://myweb.org/myrepo;Never ## REPOSITORY[webmyrepo]=http://myweb.org/myrepo;Never
## REPOSITORY[ftpmyrepo]=ftp://myftp.org/myrepo;Never
## REPOSITORY[localmyrepo]=file:///home/myrepo;Never;All ## REPOSITORY[localmyrepo]=file:///home/myrepo;Never;All
## REPOSITORY[myrepo]=/home/myrepo/mirrorlist ## REPOSITORY[myrepo]=/home/myrepo/mirrorlist
@ -1309,6 +1310,12 @@ VERSION=
## Включить поддержку OpenSSL алгоритмов ГОСТ GOST2012-GOST8912-GOST8912 GOST2001-GOST89-GOST89 ## Включить поддержку OpenSSL алгоритмов ГОСТ GOST2012-GOST8912-GOST8912 GOST2001-GOST89-GOST89
## OPENSSL_ENGINE=gost ## OPENSSL_ENGINE=gost
## Включить соответствие рекомендациям ФСТЭК, документ ФСТЭК «Рекомендации по безопасной настройке операционных систем Linux», утвержденным ФСТЭК 25 декабря 2022г.
## FSTEC-HARDENING-ADVISED=enable|disable
## Включить соответствие ФСТЭК требованиям документа «Профиль защиты операционных систем типа «А» четвертого класса защиты ИТ.ОС.ПЗ.А4
## FSTEC-HARDENING-A4=enable|disable
## Регистрации сертификатов через CEP и CES c службами сертификатов Microsoft Active Directory ## Регистрации сертификатов через CEP и CES c службами сертификатов Microsoft Active Directory
## Клиент должен быть членом домена Windows с действительным ключом Kerberos ## Клиент должен быть членом домена Windows с действительным ключом Kerberos
## CERTMONGER_CEPCES=enable|disable ## CERTMONGER_CEPCES=enable|disable
@ -1773,6 +1780,7 @@ VERSION=
## Поддерживает Multiseat по номеру порта display:0=port:5900 display:1=port:5901 display:2=port:5902 ## Поддерживает Multiseat по номеру порта display:0=port:5900 display:1=port:5901 display:2=port:5902
## X11VNC[password]=<hash_password> ## X11VNC[password]=<hash_password>
## <hash_password> # Пароль кодировать в base64: echo 'ublinux' | base64 ## <hash_password> # Пароль кодировать в base64: echo 'ublinux' | base64
## # Минимальная длиннна пароля 3-и символа
## # Пароль для VNC сервиса x11vnc-ublinux:*.service. Настроен на работу только по паролю для всех рабочих мест. ## # Пароль для VNC сервиса x11vnc-ublinux:*.service. Настроен на работу только по паролю для всех рабочих мест.
## # Создаёт шифрованный пароль в файле /root/.vnc/.passwd ## # Создаёт шифрованный пароль в файле /root/.vnc/.passwd
## X11VNC[password]=dWJsaW51eAo= ## X11VNC[password]=dWJsaW51eAo=

Loading…
Cancel
Save