1

(6 replies, posted in Configuration)

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

2

(7 replies, posted in Utilisation)

Mais bien sur teka lol:lol::lol:
Je ne dis pas ça pour t'embeter big_smile

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

3

(7 replies, posted in Configuration)

You cannot use scp, only sftp

JoK

4

(7 replies, posted in Utilisation)

C'était pourtant clair dans mon premier post je crois : roll
S'il faut à chaque fois que j'explique 3 fois .... mad

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é)

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. hmm

Cordialement

PS: le -v -v -v ne me dit rien de plus

5

(7 replies, posted in Utilisation)

Désolé mais yikes:

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 : cool

#Include /etc/my_sftp_config_file       #include this valid configuration file

Non ? big_smile

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

7

(1 replies, posted in Utilisation)

Bonjour,

J'ai un petit soucis avec <VirtualHost monnomip:22> : marche pô sad :
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

8

(4 replies, posted in Autres)

Of Course, c'est fait big_smile

Quand on peut aider wink

JoK

9

(4 replies, posted in Configuration)

Le Tag est Home et pas home
(casse)

JoK

10

(4 replies, posted in Configuration)

C'est plutôt
<Group group1>
</Group>
ou
<User user1>
</User>

et pas
<Group user1>
</Group>

11

(4 replies, posted in Autres)

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 big_smile :

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 wink

12

(4 replies, posted in Autres)

Bonjour smile

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 big_smile: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 ? smile

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 wink


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 lol
Bon alors je te vais te faire un dessin : roll

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 tongue

(De même, DefaultRights         = 0000 0000 alors que c'est plutôt 0666 0777 comme on le voit) yikes

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

16

(9 replies, posted in Autres)

Bon, je n'ai pas réussi à limiter les accès avec les Directives
MaxReadFilesForUser
MaxWriteFilesForUser
sad
Mais j'aimerais de toute façon plus de souplesse.

En fait, j'ai finalement implémenté toutes les Directives : smile

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 hmm

Qu'en pense tu ?

17

(9 replies, posted in Autres)

Euh, ben ça marche pas sad
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

18

(1 replies, posted in Utilisation)

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

19

(9 replies, posted in Autres)

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 smile
Je vous fais confiance pour corriger les énormes erreurs que j'ai pu commettre wink

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

20

(9 replies, posted in Autres)

Yes ! smile

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 roll

Et sinon elle est prévue pour quand la prochaine version tongue

Jok

21

(9 replies, posted in Autres)

Cool big_smile

Merci, mon "C" est rouillé, heureusement que j'ai pu m'inspirer de votre code. cool

Naturellement côté sécurité ce sera du style chacun chrooté chez soi wink

Sinon, je pense, par la même occasion, qu'un ForceGroup ne devrait pas couter trop cher big_smile

JoK

22

(9 replies, posted in Autres)

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

23

(8 replies, posted in Installation)

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