Windows: Cum fac...?

Am o dilema relativ la securitatea prin obscuritate versus securitate reala, daca are cineva o idee mai buna asta e descrierea cazului:
- se da un server de web care serveste niste fisiere stocate intr-o structura gen /NrProiect/Folder/Fisier
- se da un site collection in SharePoint care are zeci de mii de sites, fiecare pentru cate un proiect
- se dau niste utilizatori care au acces la fiecare site=proiect pe baza securitatii din SharePoint la nivel de site
- in site in loc de Project Library (documente locale in SharePoint in baza de date, scalabilitate si performanta câh++) utilizatorii vad lista de fisiere a proiectului, eventual sortata pe foldere (varianta simplista)
- daca un utilizator copiaza un link catre un fisier (de genul http://web-server/NrProiect/Folder/Fisier) si il da altcuiva, linkul va functiona.

In acest moment e securitate prin obscuritate pentru ca utilizatorii nu stiu calea exacta la fiecare fisier si nici nu sunt interesati. Securitatea nu e extrem de importanta (99% sunt date interne, daca un alt utilizator citeste ce nu ii e destinat e doar plictisit), dar nu inseamna ca 1% e un risc acceptabil si ca e un design prea bun.
- e nepractic sa se puna drepturi de acces la nivel de folder pentru ca sunt zeci de mii de foldere (care vor urca la sute de mii) in orice combinatie cu vreo 2000 de utilizatori
- exista posibilitatea ca in SharePoint sa se puna un link care sa faca intai autentificare si apoi redirectare catre serverul de web, dar nu stiu daca e fiabil (daca utilizatorul va putea vedea linkul real in Download history, de exemplu)
- exista posibilitatea ca in SharePoint un webpart sa ia fisierul de pe web server si sa il serveasca utilizatorului, dar cu penalitati de performanta mari; un fisier poate avea si 1-2 MB, dar si 100 MB
- exista posibilitatea ca din SharePoint sa genereze un link temporar gen /GUID-Fisier si printr-un mecanism de comunicatie sa spuna web serverului sa faca o copie fisierului cu acest nume si sa o stearga dupa X minute, dar nu stiu daca nu se poate face si mai simplu si mai sigur decat atat (in cele X minute linkul va fi valid pentru oricine)
- se poate face obscuritate si mai mare, gen inlocuit numele fisierului cu ceva gen /NrProiect/Folder/GUID, dar acel link va fi accesibil si de catre altii (sau obscuritate generala, gen /GUID1/GUID2/GUID3, dar are fix aceeasi problema)

De unde porneste toata problema: daca toate fisierele astea se tin in SharePoint Document Library moare baza de date (limita recomandata: 100 GB, practic performanta incepe sa se duca naibii si mai devreme, iar volumul de date proiectat e vreo 500 GB, deci clar moare) si apoi stocarea intr-o baza de date e de zeci de ori mai scumpa decat stocarea pe un server de web.

Alte idei?
 
Păi cât timp fișierul e accesibil pe un server web fără login, e securitate prin obscuritate. Mai uită cineva sa seteze directory listing pe server și aia e, ai toate fișierele. Cu GUID utilizatorii care au acces pot da share la link-ul fișierului, dar pe de altă parte ar putea la fel de bine trimite și fișierul în sine :smile:.

Aia cu copiile fișierelor pe web server mi se pare prea complicată și are dezavantajul că dacă nu merge ceva corect (sau dacă downloadează prea mulți în același timp) ți se poate umple discul. Plus că face I/O degeaba (read + write + iar read pentru fiecare fișier, freci prea mult disc pentru un amărât de fișier.

O soluție ok e înlocuirea web server-ului chior cu o aplicație simplă care servește fișiere de pe disc pe baza unui link one-time. Adică Sharepoint trimite cerere către această aplicație "pe link-ul http://server/aplicație/GUID servește-mi fișierul /blabla/2.pdf", iar aplicația, dacă primește cererea http, șterge înregistrarea primită de la SharePoint, citește fișierul (local, de pe disc) și îl servește (în conexiunea curentă). Înregistrarea se șterge înainte, adică indiferent dacă download-ul s-a terminat cu succes sau nu; dacă nu e cu succes, SP ar trebui să genereze altă cerere. Poate să și expire download-ul după câteva minute. Înregistrarea poate fi păstrată și in-memory la nevoie, depinde cât de des trebuie restartat server-ul/aplicația și cât de mulți utilizatori sunt (par destul de mulți). Următoarea soluție simplă e nosql.

Avantaje:
- nu expui fișierul
- chiar oferi o singură dată fișierul la download
- nu plimbi fișiere pe http dintr-o parte în alta
- nu faci I/O decât când ai nevoie
- regulile de acces sunt doar în SP
Dezavantaje:
- dacă download-ul n-a mers, trebuie generat alt link
- în funcție de cum integrezi asta în SP, e posibil să generezi link-uri on display, nu on download (adică atunci când afișezi link-ul către fișier în pagină); asta înseamnă o listă mai lungă de link-uri care poate nu vor fi vizitate niciodată
- încă o aplicație pentru mentenanță
Vulnerabilități:
- user-ul copiază link-ul/interceptează redirect-ul și îl dă altcuiva - tot o să meargă; dar așa putea să-l downloadeze el și să-l trimită pe mail :smile:

Performanța unei aplicații custom la servit fișiere de pe disc e ok vs un server web "normal" pentru 2000 de utilizatori.

Cred că pe ceva de genul ăsta se bazează site-urile "legale" de file sharing (cele cu "așteaptă 30 de secunde până poți să începi vs. dă-ne niște bani").
 
Dacă serverul web rulează Apache, ai putea folosi mod_rewrite pentru a pune condiții în funcție de HTTP referrer. Orice accesare a unui URL fără referrer sau cu referrer de la un proiect cu alt ID să facă redirect spre o pagină implicită. Un punct de pornire ar fi aici: http://httpd.apache.org/docs/2.2/rewrite/access.html#referer-deflector

Sub IIS, treaba se face un pic diferit, fiind necesar un filtru ISAPI. Sau, dacă ești admin pe serverul web, poți instala URL Rewrite ca plug-in pentru IIS; e suportat de Microsoft.
 
Web serverul nu are chiar acces anonim, e restrictional la grupul celor 2000 de utilizatori; da, fara directory listing. Securitate la nivel mai jos e posibil, dar foarte imbarligat pentru ca sunt prea multi utilizatori X prea multe sites/foldere, iar in fiecare weekend un job mai adauga sute de foldere odata, setarea securitatii ar putea lua ore in sir (programatic).

Nosql nu prea e o solutie, aia care mentin aplicatia nu stiu decat ceva SharePoint/.NET, e prea mult si prea complicat pentru ei :frown:

Din ce am vazut undeva (ghisler.com) se pot folosi linkuri care sunt valabile cate 30 de minute (catre Amazon cloud), dar nu stiu cum e facuta chestia asta.

Aplicatia aia simpla de servit fisiere ar asculta pe un port in IIS? Intreb asta pentru ca developerul e un roockie care stie ceva SharePoint si C#, nu vreun guru in web technologies. Nu tine de mine alegerea programatorului, dar pot da solutii daca sunt mai eficiente, mai simple sau mai sigure decat le-a trecut lor prin cap (solutie: necunoscuta; estimare de timp: 2 luni de programare).

Am gasit o idee despre cum sa generez un download link temporar, dar la sute de mii de fisiere actualizarea unui asemenea link la fiecare 15 minute e o incarcare serioasa. Cum proiectele respective sunt o arhiva folosita relativ rar ar putea genera linkuri doar pentru proiectul curent cand un utilizator il deschide, performanta ar fi mult mai buna, cred ca o sa incerc sa merg in directia asta; practic la deschiderea paginii in SharePoint o procedura stocata in SQL (ca daca e SharePoint tot exista) cu parametru numarul proiectului genereaza linkuri random intr-o tabela care leaga fisierele de link; la download un script de pe web server citeste in tabela ce fisier corespunde linkului si returneaza continutul fisierului. Fiecare link are un timpo de expirare in tabela, daca e depasit atunci pa-pa download, iar din cand in cand un soi de garbage collector sterge linkurile expirate. In teorie suna simplu, in practica tre' sa fie capabil nenea programatorul sa scrie asta in mai putin de o saptamana (cam atat ar fi rezonabil, zic eu).
 
Poți expune aplicația direct în IIS ca aplicație ASP.NET, ceva de genul, cu c# în spate. Codul de generare download ar fi cam așa (lipsește interogarea DB + verificare + setare ca downloaded).

E overkill să generezi link-uri când nu sunt folosite, mai ales dacă-s multe fișiere; se pot genera la deschiderea proiectului, deschiderea paginii unde sunt link-urile sau chiar când dai click pe link (dacă mai bagi un pic de cod, un webpart or smth care onclick să insereze SQL-ul pentru fișier și să facă un redirect după).
 
Aveți idee de vreun soft (free) care poate face trafic de I/O orchestrat (cu o singură consolă de comandă) de pe mai multe calculatoare cu Windows? Am nevoie de un benchmark distribuit pe vreo 20 de servere către un SAN care e shared între ele, și care merge prost, dar încă nu mi-e clar cât de prost.
 
Poți expune aplicația direct în IIS ca aplicație ASP.NET, ceva de genul, cu c# în spate. Codul de generare download ar fi cam așa (lipsește interogarea DB + verificare + setare ca downloaded).
Am facut bucata asta, cu interogarea DB cu tot, intr-o pagina asp folosind VB, ca tot stiam sintaxa. Am facut si procedura stocata care genereaza linkuri unice, problema a fost la un moment dat ca am folosit CRYPT_GEN_RANDOM care genereaza varbinary, iar includerea intr-un link creaza probleme suplimentare si pana la urma am lasat-o cu UUID care merge direct fara probleme.

Problem solved. Acum trebuie doar sa fac o mica pagina care sa listeze fisierele catre utilizator si sa inregistrez un film (captura de ecran) cu un demo ca sa vada oamenii ca merge si cum merge. Si sa bibilesc un pic codul ca sa functioneze multi-user, desi sansele de a avea acces concurent la acelasi proiect sunt poate 1 la milion o sa il fac totusi sa mearga: cand un user deschide pagina daca UUID-urile sunt deja generate de mai putin de 1/2 din durata de viata le refoloseste, altfel daca le-ar regenera nu mai merg pentru cel care a deschis primul o copie a paginii.
 
Exista vreo aplicatie care sa faca batch rename la n-spe mii de fisiere ce au file name mai mare decat permite windows? Sau alt mod cum as putea rezolva asta la modul batch fara sa le iau manual unul cate unul. Windows e prost si lasa aplicatiile sa creeze astfel de fisiere, eu am facut back-up la niste foldere ce contin asa ceva si acum cand incerc sa copiez de pe hdd-ul cu backup primesc eroare ca nu poate copia, dar nu le repara singur.
 
Total Commander sau in cel mai rau caz folosesti Excel pentru a crea un fisier bat care sa redenumeasca tot (stiu ca suna ciudat dar am mai facut-o):
- dir >> fisier.txt
- Importi fisier.txt un Excel unde aplici ceva formule pentru a scurta numele (MID de exemplu)
- Intr-o alta coloana bagi o formula din care la urma sa iasa o comanda DOS: ren fisier-nume-lung.ext nmscurt.ext"
- Copy paste acea coloana intr-un notepad, salvezi ca bat si executi in folderul tau.
 
Last edited:
Time to write about Mac OS X and Path Finder... oups.

Serios, îmi fac batch renames prin LAN pentru că pentru Windows n-am găsit ceva decent :frown:
 
That's cute.

Screen Shot 2014-10-26 at 19.35.33.png Screen Shot 2014-10-26 at 19.35.04.png Screen Shot 2014-10-26 at 19.35.14.png Screen Shot 2014-10-26 at 19.35.23.png
 
Asta e, noi cu Windows suntem mai limitați, iar tu ești troll (și offtopic, începe cu "Windows:").
 
Nu mă refeream la asta (downloaded those things you linked :biggrin:), ci la interfețele care par aruncate acolo :frown:
 
Și ce ne spui nouă? Dă mail la developeri și porcăie-i că-s doar niște coderi și n-au habar de standardele Apple de user interface, see how that works out for you :biggrin:
 
Back
Top