Skip to Content

IT nieuczesane.

what-is-my-ip – kontunuacja

Windows_PowerShell_iconpo  komentarzach na FB, zamieszczam prosty skrypt, który pozwala odpytać dwóch różnych stron – whatsmyipaddress, API, które zwraca czysty adres, ale ponieważ:

You may programmatically query that server but limit queries to no more than once per five minutes and include an appropriate user agent that will allow us to contact you if needed

dodałem starą metodę przegrzebującą się przez HTML.

get-ExternalIP.ps1

eN.

mała-wielka zmiana. MS16-072

chaoswyszła ostatnio poprawka, która zabezpiecza przed pewnymi scenariuszami MitM attacks. mniejsza-o-większość, szczegóły można doczytać na technecie, a ja chciałem się sqpić nad pewną drobną konsekwencją, która może sporo namieszać.

po zainstalowaniu tej poprawki, przestają działać te polisy, które filtrowane są na podstawie uprawnień dla poszczególnych obiektów, i nie posiadają dodanego ‚authenticated users: Read’ . w efekcie po wylistowaniu gpresult, pojawia się komunikat: ‚not applied (unknown)’ .

oczywiście – wedle ‚best practices’ nie powinno się nigdy zdejmować tego uprawnienia, a tylko wyrzucać ‚apply’, niemniej nigdy nie stanowiło to problemu.

widziałem już różne dziwne metody stosowania GPO u klientów – tak dziwne, że patrzyłem i nie wierzyłem, że można coś tak dziwnego wymyślić. efekt tego, że jakiś admin-samouk zaczął coś w pokrętny sposób wdrażać, a potem trzeba to było kontynuować, bo oczywiście posprzątanie to ryzyko i chaos. w takim środowisq, ta mała zmiana, będzie miała olbrzymi wpływ. dotknęło to również środowiska jednego z obecnych klientów, gdzie ktoś dzięki dziwnemu zestawowi uprawnień wdrożył polisy terminalowe w zupełnie odwrotny sposób – zamiast stworzyć GPO na komputer z ‚loopback processing’, zrobione były polisy na użytkowników, z wyciętymi uprawnieniami dla komputerów. nadal nie jestem pewien, jakim cudem to w ogóle działało… przyszła poprawka i wymusiła porządki.

to tak jakby ktoś miał wątpliwości, czemu warto stosować proste, prawidłowe metody, zamiast dziwolągów, bazujących na nieudokumentowanych testach – po prostu z-dnia-na-dzień mogą przestać działać.

eN.

mój zewnętrzny IP

Windows_PowerShell_icondość częste pytanie, jak się ma dynamiczny adres IP. najłatwiej oczywiście wejść na jakąś stronę, która ten adres pokazuje. ale lepiej napisać sobie skrypt (:

nie jest to skomplikowane, wystarczy użyć invoke-webRequest, który jest świetną przeglądarką textową. do testów wybrałem stronę ‚http://whatismyipaddress.com’ ale można wybrać dowolny inny. po wejściu od razu widzę, że jestem przekierowany na ‚http://whatismyipaddress.com/pl/moj-ip’. żeby oszczędzić sobie trochę grzebaniny robię inspekcję elementu, gdzie jest adres i widzę. że jest to DIV o ID=’section_left’. można to olać, ale przyda się żeby trochę zawęzić wyszukiwanie.

teraz z linii poleceń.

na początek trzeba się zaznajomić z obiektem więc warto sprawdzić:

polecam sprawdzić jeszcze $page.links oraz $page.images – może się kiedyś przydać. po wykonaniu

będzie już widać kawałek interesującego kodu. teraz trzeba wyłowić IP. do tego celu warto zrobić wyrażenie regularne, bo do tego są niezastąpione. np. takie super-proste, które po prostu szuka czterech liczb oddzielonych kropką, gdzie każda liczba ma od 1-3 cyfr:

do celów skryptu można by się poważyć o napisanie porządnej walidacji, czyli dodatkowo, żeby te liczby miały wartości od 1-255. ale to nie ten wpis. po przepuszczeniu wyniku będzie wyświetlone IP:

można teraz się dalej bawić, potestować na innych stronach, analizując elementy zwracanej strony. nie takie trudne (:

eN.

Jak szybko wygenerować certyfikaty dla Always On

Zadanie niby trywialne – skonfigurować TLS na SQL Server z grupami Always On. Chwila szukania i wiem co musi mieć template certyfikatu. https://technet.microsoft.com//en-us/library/ms189067(v=sql.105).aspx#Anchor_2 mówi, że jest potrzebne m.in.

The certificate must be meant for server authentication. This requires the Enhanced Key Usage property of the certificate to specify Server Authentication (1.3.6.1.5.5.7.3.1).

Pech chciał, że akurat miałem pasujący template, który poza tym pozwalał na client authentication i postanowiłem go użyć. Niestety takie podejście okazało się skuchą bo certyfikat musi mieć wyłącznie OID 1.3.6.1.5.5.7.3.1 . Jeśli pojawi się cokolwiek innego to koniec, kaplica, bez szans. SQL go nie uzna i nie pozwoli na użycie do szyfrowania połączeń. Z punktu widzenie bezpieczeństwa ma to sens ale mogło by się gdzieś w dokumentacji pojawić, że leniuchy będę musiały stracić czas na zastanawianie się czemu nie działa. Koniec końców, całkiem nieźle sprawdziłPKI się standardowy template Web Server :-)

Drugim problemem dla leniwego admina pojawia się wygenerowanie requestów z wszystkim nazwami listenerów (purystów przepraszam za moją hiperniepoprawną polszczyznę) na wszystkich serwerach. https://msdn.microsoft.com/en-us/library/hh213417.aspx#SSLcertificates bardzo ładnie podaje, że temat certyfikatu to hostname bądź fqdn serwera a SAN musi zawierać wszystkie nazwy DNSowe listenerów (zarówno skrócone jak i fqdn). I tu pojawiają się dwa problemy (korporacyjnie: wyzwania) bo po pierwsze serwerów jest dużo a po drugie każdy z nich ma po kilkanaście listenerów. Jako, że nie chce mi się tyle klikać w GUI a tym bardziej nie chcę zrobić nigdzie literówki, piszę coś takiego i paroma linijkami kodu ratuję sobie resztę dnia ;)

 

słowo o prywatności

privacytaka anegdotka na chwilę refleksji…

oddałem ostatnio stare kasety VHS i Hi8 do dygitalizacji. przed przekazaniem zapytałem, czy dostanę jakiś certyfikat, zapewniający, że materiał nie zostanie skopiowany ani wykorzystany bez mojej wiedzy. pan się uśmiechną, pokiwał głową i powiedział

‚wie Pan, przez tyle lat przychodziło tu tyle osób, nawet jacyś ambasadorzy, osoby publiczne…. i nikt nigdy nie prosił o takie zaświadczenie…’

eN.

 

nieautoryzowany email do zmiany hasła office365

ciekawy przypadek

firma X qpiła klientowi licencje i założyła tenant office365. projektu nie zrealizowała i przeszedł na nas. pozmienialiśmy wszystkie dane, przepięliśmy konto Global Admina, łącznie z ‚aternative mail address’. można to zrobić z interfejsu, a z PS wygląda to tak:

i niby wszystko załatwione….

ale zupełnie przypadkiem postanowiłem sprawdzić zmianę hasła i moim oczom ukazało się:

Microsoft Online Password Resetprzy czym ten drugi adres, należał do osoby z firmy X.

przeczesałem wszystkie znane miejsca i nigdzie tego adresu nie ma. w panelu o365 również widać tylko podstawowy.

o365 support

bardzo rozczarowało mnie wsparcie o365. wysłałem ticket jako partner obsługujący klienta, z oznaczeniem ‚critical – security breach’. przy każdej wymianie korespondencji były mi proponowane te same kroki, te same pytania, wysłałem screenshoty, wysłałem PSR (problem steps recoder) i nadal dostawałem instrukcję jak zmienić email przez portal o365. po kilq mailach ticket został zamknięty z informacją mniej-więcej ‚ten problem to nie problem’.  nie było eskalacji, po prostu nie potrafił rozwiązać to zamknął. łoś.

rozwiązanie

trochę mi zajęło, ale znalazłem miejsce, gdzie zapisany został drugi adres. trzeba założyć AzureAD [tak na prawdę pod spodem i tak się zakłada, ale cały portal manageazure jest nieaktywny], wyedytować właściwości domeny, włączyć usługę ‚Reset Password’ i przejść do skonfigurowania maila. okazuje się, że jest to oddzielna baza, do której nie ma innego dostępu [?]. poniżej kroki w obrazkach:

  • założenie portalu AAD

EnterAzureAD

  • Przejście do konfiguracji domenyResetPassword00
  • włączenie Reset Password. następnie trzeba przejść na stronę gdzie można skonfigurować dane [zaznaczone]ResetPassword01
  • i już widok samej strony gdzie są skonfigurowane daneResetPassword02

eN.

disconnect-msolService

qmgdzie jest disconnect-msolService?

nie jest to sesja – tak jak dla exchange online.

zajrzeć jak to działa się nie da, bo to dll’ki.

…na grzebanie po bebechach i reverse nie mam czasu /:

eN.

OneDrive for business – sync

TVtaki mały trick… ponieważ po raz kolejny rozwaliła się lokalna biblioteka, i ponieważ po raz kolejny straciłem czas i nerwy, a do normalnej wersji zostało jeszcze ok. pół roq, mały tips, który może oszczędzi komuś zgrzytów:

  • jeśli otworzy się bibliotekę z Edge albo FF to zostanie się przekierowanym na stronę z downloadem całego office2o13 – zainstaluje się 1GB po to, żeby był klient OneDrive2o13, i zaczyna tak bruździć, że pozostaje tylko usunięcie profilu użytkownika.
  • ale jak otworzy się z IE, to okazuje się, że ten klient z office16 zawiera odpowiedniego klienta i jednak potrafi synchronizować, i wtedy na jakiś czas znów można korzystać…

… aż znów z niewiadomych powodów zacznie się kaszanić. średnio biblioteka współdzielona wytrzymuje mi ok. miesiąca i zaczyna się rozjeżdżać /:

kilka rzeczy, których robić nie wolno, bo generują problemy [nie zawsze, ale lepiej unikać], dla bibliotek z wymuszeniem check-in:

  • zapisywać plik z Internetu/załącznik z maila. chodzi o ADS, który bloqje synchronizację
  • nadpisać plik. trzeba usunąć, wymusić sync i nagrać
  • korzystać z aplikacji, które robią lock na plikach

eN.

CSV, SSV… ? ULSLSSV!

Windows_PowerShell_iconwpis z cyklu ‚człowiek uczy się całe życie’ (; od zawsze pluję się, że durny Excel pliki CSV – Comma Separated Value – zapisuje/odczytuje jako Semicolon Separated Value z niewyjaśnionych przyczyn.

okazuje się, że sprawa jest bardziej skomplikowana i to nie jest ani CSV, ani SSV tylko ULSLSSV – czyli User Language Specyfic List Separator Separated Value (;

listSeparator

o ile dla US „List separator” to przecinek, więc dla Amerykanów CSV to CSV o tyle dla Polaków „List separator” to średnik… jest to dodatkowe utrudnienie na które trzeba uważać w skryptach bo mogą uruchamiać je osoby o różnych ustawieniach regionanych. o ile głupotą jest że CSV to SSV kod jest prosty:

a prawidłowo-bezpiecznie, w skryptach trzeba uważać i zamienić to na:

eN.

SecureString

Windows_PowerShell_iconscenariusz użycia

używanie SecureStringów w PS jest poniekąd wymuszone – w taki sposób przechowywane są hasła, np. w credentialsach:

SecureString przydaje się do przechowywania haseł, używanych w skryptach – np. skrypt do automatycznego podpięcia licencji office365, który wymaga podania credsów użytkownika z uprawnieniami co najmniej ‚User Manager’. można hasło zapisać w pliq jako SS a potem wewnątrz skryptu je odczytać i użyć do złożenia credsów:

bezpieczeństwo SS

rodzą się natychmiast pytania o bezpieczeństwo SecureString – czy takie hasło da się odszyfrować i jak łatwo? hasło jest szyfrowane kluczem, który generowany jest na podstawie hasła użytkownika, a masterkey jest przechowywany na komputerze lokalnym. odpowiedzialne jest za to DPAPI – tutaj znajdziecie więcej informacji. klucz jest przechowywany w $env:USERPROFILE\Application Data\Microsoft\Protect\<GUID>. w efekcie

  • plik jest nie do odczytania na innej maszynie
  • plik jest nie do odczytania przez innego użytkownika

czyli nic da ‚wykradzenie’ pliq lub użycie go w kontexcie innego użytkownika.

są potencjalnie metody potrafiące złamać klucz [np. hawkeye inject], ale nie znalazłem praktycznego opisu i na pewno nie są to metody na poziomie script kiddie. można zatem uznać, że jest to świetne narzędzie dla skryptów, które wymagają podania hasła.

addendum

na koniec – jak  odczytać hasło zapisane jako SS? podam dwie metody – dla devów i dla opsów (;

dla devów:

dla opsów:

po zbudowaniu obiektu credential z wcześniejszego przykładu, mamy zmienną $creds

eN.