New York has won two of three in a series that wraps up Sunday night.
A.J. Pierzynski hit his first home run for the Red Sox.
After striking out in the first inning and dropping his batting average to .158, McCann quickly reversed his fortunes. The seven-time All-Star who left Atlanta to sign an $85 million, five-year deal with the Yankees led off the fourth with a liner into the first row of the second deck in right field.
McCann hurried around the bases, and fans were still cheering when Soriano followed with his third home run of the week.
Beltran opened the sixth with a double and McCann homered to right-center. It was the catcher's 10th career multihomer game.
The Red Sox have been shifting on McCann during this series, moving an extra infielder onto the right side once they get a strike on him. Facing Lackey for the first time, McCann made moot any shift.
Hiroki Kuroda (2-1) pitched into the seventh, and reliever Matt Thornton gave up Mike Carp's two-run single that made it 6-4. With runners at the corners, Carp was caught stealing for the third out.
Shawn Kelley pitched a perfect ninth for his second save.
Lackey (2-1) threw plenty of strikes, but gave up 10 hits. He walked none, fanned six and missed a chance to get off to a 3-0 start for the first time in his career.
Jacoby Ellsbury bunted for a two-out single in the first and Beltran homered on an 0-2 pitch right down the middle. Lackey was already stalking toward the plate to get a new ball from the umpire before Beltran reached second base.
Johnson hit his third homer in the eighth.
NOTES: Soriano had played only one inning in right field during his career - in the 2003 World Series, in fact - before starting there in this game. He made an error on the first chance he got, dropping a soft fly by Xander Bogaerts. ... David Ortiz has reached safely in 25 straight games against the Yankees, the longest active streak vs. New York. He got one hit, and is 11 for 20 lifetime facing Kuroda. ... The Yankees hit back-to-back homers for the first time since last June 6. ... Red Sox CF Grady Sizemore didn't start, a day after his big three-run homer beat the Yankees. He missed the last two seasons because of injuries, and manager John Farrell doesn't want to overuse him. ... Yankees SS Derek Jeter got a day off. ... Yankees 1B Mark Teixeira (strained right hamstring) said his recovery is going well. He's eligible to come off the DL next weekend and manager Joe Girardi said he'd be surprised if Teixeira isn't back on time. ... Red Sox LHP Felix Doubront (1-1, 9.00 ERA) is set to face RHP Ivan Nova (1-1, 8.68) in the series finale.