Hello,
pour pouvoir chrooter, il est possible de faire un montage du repertoire voulu vers un repertoire contenu dans le home dir via :
mount --bind olddir newdir
JoKnarf
You are not logged in. Please login or register.
MySecureShell forum → Posts by JoKnarf
Pages 1
Hello,
pour pouvoir chrooter, il est possible de faire un montage du repertoire voulu vers un repertoire contenu dans le home dir via :
mount --bind olddir newdir
JoKnarf
Mais bien sur teka :lol::lol:
Je ne dis pas ça pour t'embeter
Je sais bien que ce n'est pas un full time job, c'est pourquoi j'essaye de débroussailler avant de vous ennuyer tous les 2 avec mes pb
JoK
You cannot use scp, only sftp
JoK
C'était pourtant clair dans mon premier post je crois :
S'il faut à chaque fois que j'explique 3 fois ....
si je fais
sftp_config:
<Default>
LogFile /var/log/sftp-server.log
</Default>
Include /usr/local/etc/sftp_config2sftp_config2 :
<User tstmss>
Home /tmp
</User>sudo -u tstmss MySecureShell --configtest
--- tstmss ---
GlobalDownload = 0 bytes/s
GlobalUpload = 0 bytes/s
Download = 0 bytes/s
Upload = 0 bytes/s
StayAtHome = false
VirtualChroot = false
LimitConnection = 0
LimitConnectionByUser = 0
LimitConnectionByIP = 0
Home = /home/tstmss
...
Pas d'erreur mais le Home n'est pas pris en compte (sftp_config2 n'est pas loadé)
C'est donc encore un bug...
Je pense ne pas poser trop de questions stupides et d'essayer d'encourager ce projet, merci donc de vérifier un minimum avant de répondre.
Cordialement
PS: le -v -v -v ne me dit rien de plus
Désolé mais :
joknarf@jk-eeepc:~$ cat /etc/ssh/sftp_config
<Default>
Home /var/tmp
</Default>
<User joknarf>
Include /tmp/sftpconf
</User>
joknarf@jk-eeepc:~$ cat /tmp/sftpconf
Home /tmp
joknarf@jk-eeepc:~$ MySecureShell --configtest
[ERROR]Missing 1 close(s) tag(s) in file '/tmp/sftpconf'!!!
De plus, je pense que pouvoir faire un Include autrement qu'a l'intérieur d'une section est nettement plus souple, comme c'est Indiqué dans le sftp_config par défaut :
#Include /etc/my_sftp_config_file #include this valid configuration file
Non ?
Personnellement j'utilise cela ainsi pour des configurations en cluster failover et c'est très pratique de faire l'Include du sftp_config propre aux services cluster qui basculent (La conf MySecureShell bascule ainsi avec le service, pas besoin de répliquer la conf sur l'ensemble des noeuds du cluster)
JoK
Hello,
Petit souci avec Include, je ne comprends pas bien comment on doit l'utiliser :
si je fais
sftp_config:
<Default>
LogFile /var/log/sftp-server.log
</Default>
<User tstmss>
Include /usr/local/etc/sftp_config2
</User>
sftp_config2 :
Home /tmp
sudo -u tstmss MySecureShell --configtest
[ERROR]Missing 1 close(s) tag(s) in file '/tmp/sftp_config'!!!
----------------------------------------------------
si je fais
sftp_config:
<Default>
LogFile /var/log/sftp-server.log
</Default>
Include /usr/local/etc/sftp_config2
sftp_config2 :
<User tstmss>
Home /tmp
</User>
sudo -u tstmss MySecureShell --configtest
--- tstmss ---
GlobalDownload = 0 bytes/s
GlobalUpload = 0 bytes/s
Download = 0 bytes/s
Upload = 0 bytes/s
StayAtHome = false
VirtualChroot = false
LimitConnection = 0
LimitConnectionByUser = 0
LimitConnectionByIP = 0
Home = /home/tstmss
...
Pas d'erreur mais le Home n'est pas pris en compte (sftp_config2 n'est pas loadé)
-----------------------------------------------------------
Si je fais :
sftp_config:
<Default>
LogFile /var/log/sftp-server.log
</Default>
<User tstmss>
Include /usr/local/etc/sftp_config2
sftp_config2 :
Home /tmp
</User>
sudo -u tstmss MySecureShell --configtest
--- tstmss-
GlobalDownload = 0 bytes/s
GlobalUpload = 0 bytes/s
Download = 0 bytes/s
Upload = 0 bytes/s
StayAtHome = false
VirtualChroot = false
LimitConnection = 0
LimitConnectionByUser = 0
LimitConnectionByIP = 0
Home = /tmp
La c'est ok mais
sudo -u tstmss2 MySecureShell --configtest
[ERROR]Missing 1 close(s) tag(s) in file '/usr/local/etc/sftp_config'!!!
Alors comment c'est sensé fonctionner ?
Pour le faire fonctionner j'ai remplacé :
conf.c
else
if (processTag == 0)
continue;
else
if ((tb = parse_cut_string(str)))
{
if (tb[0])
processLine(tb, max_recursive_left, verbose);
free(tb);
}
par
else if ((tb = parse_cut_string(str)))
{
if (tb[0])
if( (processTag==1) || (strcmp("Include",tb[0])==0) )
processLine(tb, max_recursive_left, verbose);
free(tb);
}
Dans ce cas:
on peut faire :
<Default>
LogFile /var/log/sftp-server.log
</Default>
Include /usr/local/etc/sftp_config2
sftp_config2
<User tstmss>
Home /tmp
</User>
Merci
JoK
Bonjour,
J'ai un petit soucis avec <VirtualHost monnomip:22> : marche pô :
alors j'ai essayé de voir pourquoi :
parsing.c
(void )snprintf(buffer, sizeof(buffer), "%ui.%ui.%ui.%ui",
(unsigned int)h->h_addr_list[0][0],
(unsigned int)h->h_addr_list[0][1],
(unsigned int)h->h_addr_list[0][2],
(unsigned int)h->h_addr_list[0][3]
);
souci avec %ui :
user.c
current_host = (char *)hash_get("VIRTUALHOST_IP");
current_port = hash_get_int("VIRTUALHOST_PORT");
// ajout print pour comprendre
if(current_host != NULL) (void )printf("%s %i", current_host,current_port);
printf donne :
4294967224i.90i.23i.108i
au lieu de 184.90.23.108
avec %u
donne :
4294967224.90.23.108
mieux mais pas top
Visiblement ça se fait plutôt comme ça :
parsing.c :
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
struct in_addr in;
(void) memcpy(&in.s_addr, *h->h_addr_list, sizeof (in.s_addr));
(void )snprintf(buffer, sizeof(buffer), "%s", inet_ntoa(in));
testé sur Solaris/Linux ok
JoK
Of Course, c'est fait
Quand on peut aider
JoK
Le Tag est Home et pas home
(casse)
JoK
C'est plutôt
<Group group1>
</Group>
ou
<User user1>
</User>
et pas
<Group user1>
</Group>
Le DisableReadDir permet d'empêcher le listing des directories
=> en anonyme ou non plusieurs utilités :
exemples :
- repository de fichiers ou la sécurité est gérée au niveau nom de fichier (le nom du fichier à télécharger est envoyé a l'utilisateur)
- depose de fichiers sans connaître ce qui est déjà déposé
... tout ce genre de choses
A ce propos, il me vient d'autres idées complémentaires :
DisableOverwrite : Empêche écrasement fichier s'il existe déjà
CreateHome : Creer le Home dir s'il n'existe pas (peut être intéressant par exemple avec Home /home/$SSH_CONNECTION qui crée un home a partir IP de connection)
UploadUseTmp : ce serait un mode de transfert ou l'upload se fait sur un fichier temporaire qui est ensuite renommé avec son nom final, ce qui permet d'avoir côté server un daemon qui checke la présence de fichiers pour lancer un traitement dessus, en mode standard le daemon ne sait pas facilement si le transfert est terminé, alors qu'avec le renommage oui.
exemple :
put "fichier"
= transfert vers ".fichier.<pid>"
+ renommage en "fichier"
A Bientôt
Bonjour
Quelques idées de Directives :
ForceUser
ForceGroup
(normalement ok, sur autre topic)
MaximumRights
ForceRights
CanReadFile
CanReadDir
CanWriteFile
CanSetAttribute
CanMakeDir
CanRename
CanSymLink
ou bien
DisableReadFile
DisableReadDir
DisableWriteFile
DisableSetAttribute
DisableMakeDir
DisableRename
DisableSymLink
DisableOverwrite : Empêche écrasement fichier s'il existe déjà
CreateHome : Creer le Home dir s'il n'existe pas (peut être intéressant par exemple avec Home /home/$SSH_CONNECTION qui crée un home a partir IP de connection)
UploadUseTmp : ce serait un mode de transfert ou l'upload se fait sur un fichier temporaire qui est ensuite renommé avec son nom final, ce qui permet d'avoir côté serveur un daemon qui checke la présence de fichiers pour lancer un traitement dessus, en mode standard le daemon ne sait pas facilement si le transfert est terminé, alors qu'avec le renommage oui.
exemple :
put "fichier"
= transfert vers ".#fichier#.<pid>"
+ renommage en "fichier"
Ce serait trop bien :D:D
JoK
Oui, tout a fait d'accord, c'est un bug d'affichage, mais c'est un peu gênant pour checker la conf, non ?
C'est pourquoi j'avais suggéré pour le corriger :
Soit nouveau type : CONF_IS_BOOLEAN_DEFAULT_TRUE
Soit renommer CanRemoveDir et CanRemoveFile en :
DisableRemoveDir
DisableRemoveFile
comme ça valeurs par défaut à false : déjà gérées
mais c'est juste pour aider, MSS est déjà si proche de la perfection
sinon concernant les DefaultRights, je ne crois pas trop que ce soit côté client :
main.c
if (hash_get_int("DefaultRightsDirectory") > 0)
params->rights_directory = hash_get_int("DefaultRightsDirectory");
else
params->rights_directory = 0777;
if (hash_get_int("DefaultRightsFile") > 0)
params->rights_file = hash_get_int("DefaultRightsFile");
else
params->rights_file = 0666;
moi je dis ça je dis rien ...:rolleyes:
A+
JoK
Non, sans blague
Bon alors je te vais te faire un dessin :
sftp_config
<Default>
</Default>
# sudo -u tstmss MySecureShell --configtest
--- tstmss ---
GlobalDownload = 0 bytes/s
GlobalUpload = 0 bytes/s
Download = 0 bytes/s
Upload = 0 bytes/s
StayAtHome = false
VirtualChroot = false
LimitConnection = 0
LimitConnectionByUser = 0
LimitConnectionByIP = 0
Home = /home/tstmss
Shell = (null)
ResolveIP = false
IdleTimeOut = 0
IgnoreHidden = false
DirFakeUser = false
DirFakeGroup = false
DirFakeMode = {default}
HideFiles = {nothing}
HideNoAccess = false
ByPassGlobalDownload = false
ByPassGlobalUpload = false
MaxOpenFilesForUser = 0
MaxReadFilesForUser = 0
MaxWriteFilesForUser = 0
ShowLinksAsLinks = false
PathDenyFilter = (null)
SftpProtocol = {default}
LogFile = {default}
ConnectionMaxLife = 0s
DisableAccount = false
Charset = (null)
GMTTime = {nothing}
CanRemoveDir = false
CanRemoveFile = false
ExpireDate = {nothing}
MinimumRights = 0000 0000
DefaultRights = 0000 0000
Config is valid.
#sftp tstmss@localhost
sftp> mkdir tutu
sftp> ls -l
drwxrwxrwx 2 tstmss tstmss 4096 May 29 18:41 tutu
sftp> rmdir tutu
sftp> ls -l
sftp> lcd /etc
sftp> put motd
sftp> ls -l
-rw-rw-rw- 1 tstmss tstmss 1534 May 29 18:43 motd
sftp> rm motd
Removing /home/tstmss/motd
sftp> ls -l
sftp> quit
On a bien configtest qui nous dit :
CanRemoveDir = false
CanRemoveFile = false
alors que rmdir et rm sont actifs
(De même, DefaultRights = 0000 0000 alors que c'est plutôt 0666 0777 comme on le voit)
JoK
Hello,
Un petit soucis avec les Directives CanRemoveDir et CanRemoveFile lorsqu'on execute MySecureShell --configtest on obtient :
CanRemoveDir = false
CanRemoveFile = false
Alors qu'en fait c'est "true"
Le booléen à valeur par Defaut à true n'est pas remonté correctement
A mon avis 2 solutions :
Soit nouveau type : CONF_IS_BOOLEAN_DEFAULT_TRUE
Soit renommer CanRemoveDir et CanRemoveFile en :
DisableRemoveDir
DisableRemoveFile
avec valeurs par défaut à false.
Jok
Bon, je n'ai pas réussi à limiter les accès avec les Directives
MaxReadFilesForUser
MaxWriteFilesForUser
Mais j'aimerais de toute façon plus de souplesse.
En fait, j'ai finalement implémenté toutes les Directives :
CanReadFile
CanReadDir
CanWriteFile
CanSetAttribute
CanMakeDir
CanRename
CanSymLink
Avec Macro Directives :
DownloadOnly true =
CanWriteFile
CanSetAttribute
CanMakeDir
CanRename
CanSymLink
à false
UploadOnly true =
CanReadFile
CanReadDir
à false
Afin de pouvoir faire des confs aux petits oignons (interdire browsing...)
(hash_get_int("UploadOnly")? 0 :
(hash_get_int_with_default("CanReadFile", 1) ? SFTPWHO_CAN_READ : 0) +
(hash_get_int_with_default("CanReadDir", 1) ? SFTPWHO_CAN_READDIR : 0)
)+
(hash_get_int("DownloadOnly")? 0 :
(hash_get_int_with_default("CanRemoveDir", 1) ? SFTPWHO_CAN_RMDIR : 0) +
(hash_get_int_with_default("CanRemoveFile", 1) ? SFTPWHO_CAN_RMFILE : 0) +
(hash_get_int_with_default("CanMakeDir", 1) ? SFTPWHO_CAN_MKDIR : 0) +
(hash_get_int_with_default("CanWriteFile", 1) ? SFTPWHO_CAN_WRITE : 0) +
(hash_get_int_with_default("CanSetAttribute", 1) ? SFTPWHO_CAN_SETSTAT : 0) +
(hash_get_int_with_default("CanRename", 1) ? SFTPWHO_CAN_RENAME : 0) +
(hash_get_int_with_default("CanSymLink", 1) ? SFTPWHO_CAN_SYMLINK : 0)
);
Personnellement ce sont des besoins que j'ai réellement de pouvoir finement mettre ces autorisations, car je ne peux compter sur les droits positionnés sur les fichiers/répertoires par les users locaux du serveur sftp
Qu'en pense tu ?
Euh, ben ça marche pas
Avec les valeurs -1 aux Directives :
MaxWriteFilesForUser -1
MaxReadFilesForUser -1
j'arrive très bien à downloader, uploader, chmod ... (testé sur Linux+Solaris)
J'ai loupé quelque chose ?
JoK
Bonjour,
J'ai un petit souci, lorsque j'exécute MySecureShell avec --config-test, j'obtient un segfault à la première variable STRING non définie dans le sftp_config (ici Shell) :
MySecureShell --configtest
--- root ---
GlobalDownload = 51200 bytes/s
GlobalUpload = 0 bytes/s
Download = 5120 bytes/s
Upload = 0 bytes/s
StayAtHome = true
VirtualChroot = true
LimitConnection = 10
LimitConnectionByUser = 10
LimitConnectionByIP = 10
Home = /home/root
Segmentation Fault(coredump)
dans le code :
conf.c
if (ptr == NULL && confParams[i].show == CONF_SHOW_IF_NOT_NULL)
(void )printf("{default}");
else
(void )printf("%s", ptr);
il semble que ptr soit NULL mais confParams[i].show != CONF_SHOW_IF_NOT_NULL
=> boom
JoK
Hello,
Voici une implémentation possible des Directives :
CanMakeDir (default true)
DownloadOnly (default false)
UploadOnly (default false)
J'espère que vous pourrez l'intégrer à la prochaine version
Je vous fais confiance pour corriger les énormes erreurs que j'ai pu commettre
conf.c
{ "CanMakeDir", CONF_IS_BOOLEAN, CONF_SHOW },
{ "DownloadOnly", CONF_IS_BOOLEAN, CONF_SHOW },
{ "UploadOnly", CONF_IS_BOOLEAN, CONF_SHOW },
SftpServer/SftpWho.h
#define SFTPWHO_CAN_READ (1 << 23)
#define SFTPWHO_CAN_WRITE (1 << 24)
#define SFTPWHO_CAN_SETSTAT (1 << 25)
#define SFTPWHO_CAN_MKDIR (1 << 26)
#define SFTPWHO_CAN_RENAME (1 << 27)
#define SFTPWHO_CAN_SYMLINK (1 << 28)
main.c
(hash_get_int_with_default("UploadOnly", 0)? 0 : SFTPWHO_CAN_READ )+
(hash_get_int_with_default("DownloadOnly", 0)? 0 :
(hash_get_int_with_default("CanRemoveDir", 1) ? SFTPWHO_CAN_RMDIR : 0) +
(hash_get_int_with_default("CanRemoveFile", 1) ? SFTPWHO_CAN_RMFILE : 0) +
(hash_get_int_with_default("CanMakeDir", 1) ? SFTPWHO_CAN_MKDIR : 0) +
SFTPWHO_CAN_WRITE+
SFTPWHO_CAN_SETSTAT+
SFTPWHO_CAN_RENAME+
SFTPWHO_CAN_SYMLINK
);
SftpServer/Sftp.c function DoOpen()
after : flags |= FlagsFromPortable(pflags, &textMode);
if( ((flags & O_WRONLY) && (gl_var->who->status & SFTPWHO_CAN_WRITE)) ||
(!(flags & O_WRONLY) && (gl_var->who->status & SFTPWHO_CAN_READ)) )
{
}
else
status = SSH2_FX_PERMISSION_DENIED;
and in different functions :
DoSetStat() et DoFSetStat()
if ((gl_var->who->status & SFTPWHO_CAN_SETSTAT)) ...
DoMkDir()
if ((gl_var->who->status & SFTPWHO_CAN_MKDIR)) ...
DoRename()
if((gl_var->who->status & SFTPWHO_CAN_RENAME))...
DoSymLink
if((gl_var->who->status & SFTPWHO_CAN_SYMLINK))...
JoK
Yes !
Sinon, j'ai une autre suggestion, une directive DownloadOnly serait super cool. En effet, il y a des users qui ont une facheuse habitude de faire du chmod 777 sur leurs fichiers.
Avec cette Directive pas besoin de faire trop gaffe aux droits sur les fichiers si on ne veut autoriser que du Download.
DownloadOnly true
=> Désactivation put chown chmod rm rmdir mkdir ln
Et puis aussi une directive CanMakeDir en complément de CanRemoveDir
Et sinon elle est prévue pour quand la prochaine version
Jok
Cool
Merci, mon "C" est rouillé, heureusement que j'ai pu m'inspirer de votre code.
Naturellement côté sécurité ce sera du style chacun chrooté chez soi
Sinon, je pense, par la même occasion, qu'un ForceGroup ne devrait pas couter trop cher
JoK
Bonjour à tous,
Une idée comme ça, ne serait-il pas possible de forcer le sftp avec un autre user que celui de l'authentification afin d'avoir un propriétaire unique des fichiers uploadé (comme c'est possible en samba) ?
Une directive du style :
ForceUser sftpuser
Cordialement
Et encore une fois, bravo pour le produit (in French this time)
JoK
First of all, crongratulations for this great tool.
Here is how I managed to compile it on Solaris 8 :
1- pb with u_int16_t
In file included from SftpServer/Sftp.h:25,
from main.c:31:
SftpServer/SftpWho.h:68: parse error before `u_int16_t'
=>added in SftpServer/SftpWho.h
typedef uint16_t u_int16_t;
pb then here
Compile [SftpWho/Main.c]
In file included from SftpWho/Main.c:25:
SftpWho/../SftpServer/SftpWho.h:68: parse error before `u_int32_t'
=>change includes in SftpWho/Main.c
#include "../config.h"
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include "../conf.h"
#include "../hash.h"
#include "../ip.h"
#include "../prog.h"
#include "../SftpServer/SftpWho.h"
2- pb with -Xlinker --as-needed options with ld :
unrecognized option '--as-needed'
=>options removed on LDFLAGS from Makefile
LDFLAGS=
3- add -lsocket and -liconv in Makefile
add -R /usr/local/lib for suid bit library search in this dir
$(NAME) : $(OBJ)
@echo "Compile binary [$(NAME)]"
@$(CC) -lsocket -liconv -R /usr/local/lib -o $(NAME) $(OBJ) $(LDFLAGS)
@$(CHMOD) 755 $(NAME)
sftpwho : $(OBJ1)
@echo "Compile binary [$(NAME1)]"
@$(CC) -lsocket -o $(NAME1) $(OBJ1) $(LDFLAGS)
@$(CHMOD) 711 $(NAME1)
After that the make is ok
I hope it can help, and I wish a long life to MySecureShell
JoK
Pages 1
MySecureShell forum → Posts by JoKnarf
Powered by PunBB, supported by Informer Technologies, Inc.