Franck Kessie's penalty on the stroke of half-time and Samu Castillejo's 77th-minute strike were just enough for the seven-time European champions, who were without injured talisman Zlatan Ibrahimovic, to move up to 26 points and keep second-placed local rivals Inter Milan at arm's length.
Ivory Coast midfielder Kessie coolly struck home his spot-kick after Jakub Jankto unluckily handled while challenging for the ball with Theo Hernandez.
Sandro Tonali hit the post for Milan just after the break but the away side were on the back foot for much of the second half until substitute Castillejo doubled their lead with his first touch, set up by a fine pull-back from Ante Rebic.
Rebic would then surely have removed all doubt with 11 minutes left had Davide Calabria not ruined a fine team moved by duffing his pass to the waiting Croatian, who is yet to score this season.
That left Stefano Pioli's team to sweat out the final minutes after Albin Ekdal's powerful header just escaped Gianluigi Donnarumma's clutches, and their lead at the top of the table would have been cut to three had Swede Ekdal not put another aerial effort wide with the last attack of the game.
Atalanta's match at Udinese was postponed after heavy rain made the pitch unplayable.
Fiorentina host fellow strugglers Genoa on Monday night.